diff --git a/LICENSE.md b/LICENSE.md index bd001c6..6b111d1 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -1,44 +1,674 @@ -# ILLUSIONER LICENSE + 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. -## Version 1.0, August 2020 + Preamble +The GNU General Public License is a free, copyleft license for +software and other kinds of works. -## Definitions +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. -"Package" refers to the collection of files (unless something else is indicated inside the file) distributed -by the Copyright Holder, and derivatives of that collection of files created through textual modification. +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. -"Copyright Holder" is whoever is named in the copyright or copyrights for the package. +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. -"You" is you, if you're thinking about copying or distributing this Package. +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. -## Copyright (C) 2020 Will Favier-Parsons +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. -You are not allowed to redistribute full, partial or modified versions of the package to which the license -is associated. This license does not apply to modules or extensions that use but do not contain full, -partial or modified code from this package. +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. -By purchasing the package from the offical distributor (spigotmc.org) you agree to the following terms: +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. -1. No refunds, under any circumstance, unless explicitly approved by the copyright holder. +The precise terms and conditions for copying, distribution and +modification follow. -2. You are of legal age and/or have permission from your legal guardian. + TERMS AND CONDITIONS +0. Definitions. -## ILLUSIONER LICENSE -### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +"This License" refers to version 3 of the GNU General Public License. -1. Do whatever you like with the original work, as long as you keep it for yourself or have the Copyright -Holder's permission. +"Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. -2. You are not allowed to redistribute full, partial or modified versions of the package +"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. -3. Code is provided with no warranty. You have the right (and are even encouraged) to propose improvements -to the package as long as you don't use it as a way to circumvent the restrictions of the license. +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. -4. By proposing a modification you agree to assign all your rights on your code to the Copyright Holder. -You must therefore own the modifications you propose or have the permission to assign their rights. +A "covered work" means either the unmodified Program or a work based +on the Program. -5. All modified versions of the package must also be open-source \ No newline at end of file +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/NMS/API/build.gradle b/NMS/API/build.gradle deleted file mode 100644 index 32b0140..0000000 --- a/NMS/API/build.gradle +++ /dev/null @@ -1,9 +0,0 @@ -dependencies { - compileOnly 'org.spigotmc:spigot-api:1.15.2-R0.1-SNAPSHOT' -} - -jar{ - archiveFileName = findProperty("Name") + " v" + findProperty("version") + ".jar" -} - -description = 'Illusioner API' diff --git a/NMS/API/src/main/java/com/willfp/illusioner/nms/api/EntityIllusionerWrapper.java b/NMS/API/src/main/java/com/willfp/illusioner/nms/api/EntityIllusionerWrapper.java deleted file mode 100644 index 03caf1b..0000000 --- a/NMS/API/src/main/java/com/willfp/illusioner/nms/api/EntityIllusionerWrapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.willfp.illusioner.nms.api; - -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.boss.BossBar; -import org.bukkit.plugin.Plugin; - -/** - * NMS Interface for managing illusioner bosses - */ -public interface EntityIllusionerWrapper { - BossBar createBossbar(Plugin plugin, BarColor color, BarStyle style); -} \ No newline at end of file diff --git a/NMS/API/src/main/java/com/willfp/illusioner/nms/api/IllusionerWrapper.java b/NMS/API/src/main/java/com/willfp/illusioner/nms/api/IllusionerWrapper.java deleted file mode 100644 index 7dfa5d4..0000000 --- a/NMS/API/src/main/java/com/willfp/illusioner/nms/api/IllusionerWrapper.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.willfp.illusioner.nms.api; - -import org.bukkit.Location; - -/** - * NMS Interface for managing illusioner bosses - */ -public interface IllusionerWrapper { - EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name); - EntityIllusionerWrapper adapt(org.bukkit.entity.Illusioner illusioner, Location location, double maxHealth, double attackDamage, String name); -} \ No newline at end of file diff --git a/NMS/v1_15_R1/build.gradle b/NMS/v1_15_R1/build.gradle deleted file mode 100644 index 6eff629..0000000 --- a/NMS/v1_15_R1/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - compileOnly project(':API') - compileOnly 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT' -} - -jar{ - archiveFileName = project.name + " v" + findProperty("version") + ".jar" -} - -description = 'v1_15_R1' diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/Illusioner.java b/NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/Illusioner.java deleted file mode 100644 index f4bb5dd..0000000 --- a/NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/Illusioner.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.willfp.illusioner.v1_15_R1; - -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import com.willfp.illusioner.nms.api.IllusionerWrapper; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_15_R1.entity.CraftIllusioner; - -public class Illusioner implements IllusionerWrapper { - @Override - public EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name) { - EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); - ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); - return illusioner; - } - - @Override - public EntityIllusionerWrapper adapt(org.bukkit.entity.Illusioner illusioner, Location location, double maxHealth, double attackDamage, String name) { - if(illusioner instanceof CraftIllusioner) { - if(((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerWrapper) return null; - } else return null; - illusioner.remove(); - return spawn(location, maxHealth, attackDamage, name); - } -} diff --git a/NMS/v1_16_R1/build.gradle b/NMS/v1_16_R1/build.gradle deleted file mode 100644 index 7c2e23d..0000000 --- a/NMS/v1_16_R1/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - compileOnly project(':API') - compileOnly 'org.spigotmc:spigot:1.16.1-R0.1-SNAPSHOT' -} - -jar{ - archiveFileName = project.name + " v" + findProperty("version") + ".jar" -} - -description = 'v1_16_R1' diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/Illusioner.java b/NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/Illusioner.java deleted file mode 100644 index c428f58..0000000 --- a/NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/Illusioner.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.willfp.illusioner.v1_16_R1; - -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import com.willfp.illusioner.nms.api.IllusionerWrapper; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R1.entity.CraftIllusioner; - -public class Illusioner implements IllusionerWrapper { - @Override - public EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name) { - EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); - ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); - return illusioner; - } - - @Override - public EntityIllusionerWrapper adapt(org.bukkit.entity.Illusioner illusioner, Location location, double maxHealth, double attackDamage, String name) { - if(illusioner instanceof CraftIllusioner) { - if(((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerWrapper) return null; - } else return null; - illusioner.remove(); - return spawn(location, maxHealth, attackDamage, name); - } -} diff --git a/NMS/v1_16_R2/build.gradle b/NMS/v1_16_R2/build.gradle deleted file mode 100644 index de4e64c..0000000 --- a/NMS/v1_16_R2/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - compileOnly project(':API') - compileOnly 'org.spigotmc:spigot:1.16.2-R0.1-SNAPSHOT' -} - -jar{ - archiveFileName = project.name + " v" + findProperty("version") + ".jar" -} - -description = 'v1_16_R2' diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/Illusioner.java b/NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/Illusioner.java deleted file mode 100644 index 3ced46a..0000000 --- a/NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/Illusioner.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.willfp.illusioner.v1_16_R2; - -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import com.willfp.illusioner.nms.api.IllusionerWrapper; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R2.entity.CraftIllusioner; - -public class Illusioner implements IllusionerWrapper { - @Override - public EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name) { - EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); - ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); - return illusioner; - } - - @Override - public EntityIllusionerWrapper adapt(org.bukkit.entity.Illusioner illusioner, Location location, double maxHealth, double attackDamage, String name) { - if(illusioner instanceof CraftIllusioner) { - if(((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerWrapper) return null; - } else return null; - illusioner.remove(); - return spawn(location, maxHealth, attackDamage, name); - } -} diff --git a/NMS/v1_16_R3/build.gradle b/NMS/v1_16_R3/build.gradle deleted file mode 100644 index 30bc19f..0000000 --- a/NMS/v1_16_R3/build.gradle +++ /dev/null @@ -1,10 +0,0 @@ -dependencies { - compileOnly project(':API') - compileOnly 'org.spigotmc:spigot:1.16.4-R0.1-SNAPSHOT' -} - -jar{ - archiveFileName = project.name + " v" + findProperty("version") + ".jar" -} - -description = 'v1_16_R3' diff --git a/NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/Illusioner.java b/NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/Illusioner.java deleted file mode 100644 index 8e38bf7..0000000 --- a/NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/Illusioner.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.willfp.illusioner.v1_16_R3; - -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import com.willfp.illusioner.nms.api.IllusionerWrapper; -import org.bukkit.Location; -import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; -import org.bukkit.craftbukkit.v1_16_R3.entity.CraftIllusioner; - -public class Illusioner implements IllusionerWrapper { - @Override - public EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name) { - EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); - ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); - return illusioner; - } - - @Override - public EntityIllusionerWrapper adapt(org.bukkit.entity.Illusioner illusioner, Location location, double maxHealth, double attackDamage, String name) { - if(illusioner instanceof CraftIllusioner) { - if(((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerWrapper) return null; - } else return null; - illusioner.remove(); - return spawn(location, maxHealth, attackDamage, name); - } -} diff --git a/Plugin/build.gradle b/Plugin/build.gradle deleted file mode 100644 index b9df11d..0000000 --- a/Plugin/build.gradle +++ /dev/null @@ -1,48 +0,0 @@ -plugins { - id 'com.github.johnrengelman.shadow' version '5.2.0' -} - -dependencies { - implementation project(':API') - implementation project(':v1_15_R1') - implementation project(':v1_16_R1') - implementation project(':v1_16_R2') - implementation project(':v1_16_R3') - implementation 'org.apache.maven:maven-artifact:3.0.3' - implementation 'org.jetbrains:annotations:19.0.0' - implementation 'org.bstats:bstats-bukkit:1.7' - compileOnly 'org.spigotmc:spigot-api:1.16.3-R0.1-SNAPSHOT' - compileOnly 'commons-io:commons-io:2.8.0' - compileOnly 'com.willfp:EcoEnchants:5.10.5' -} - -shadowJar { - relocate('org.bstats.bukkit', 'com.willfp.illusioner.shaded.bstats') - relocate('org.jetbrains', 'com.willfp.illusioner.shaded.jetbrains') - relocate('org.intellij', 'com.willfp.illusioner.shaded.intellij') - relocate('org.apache.maven', 'com.willfp.illusioner.shaded.maven') - archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + ".jar" -} - -processResources { - filesNotMatching(["**/*.png", "**/models/**", "**/textures/**"]) { - expand projectVersion: findProperty("version") - } -} - -jar { - archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + " " + "unshaded" + ".jar" -} - -tasks.withType(JavaCompile) { - options.encoding = 'UTF-8' -} - -tasks.withType(Jar) { - destinationDirectory = file("$rootDir/bin/") -} - -build.dependsOn shadowJar - -description = 'Illusioner' -compileJava.options.encoding = 'UTF-8' diff --git a/Plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java b/Plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java deleted file mode 100644 index 12694ea..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.willfp.illusioner; - -import com.willfp.illusioner.util.internal.Loader; -import org.bukkit.Bukkit; -import org.bukkit.plugin.java.JavaPlugin; - -/** - * The Main class for Illusioner - */ -public class IllusionerPlugin extends JavaPlugin { - /** - * Instance of Illusioner - */ - private static IllusionerPlugin instance; - - /** - * NMS version - */ - public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; - - /** - * Calls {@link Loader#load()} - */ - public void onEnable() { - Loader.load(); - } - - /** - * Calls {@link Loader#unload()} - */ - public void onDisable() { - Loader.unload(); - } - - /** - * Sets instance - */ - public void onLoad() { - instance = this; - } - - /** - * Get plugin instance - * @return Plugin instance - */ - public static IllusionerPlugin getInstance() { - return instance; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/command/AbstractCommand.java b/Plugin/src/main/java/com/willfp/illusioner/command/AbstractCommand.java deleted file mode 100644 index bb32e7e..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/command/AbstractCommand.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.willfp.illusioner.command; - -import com.willfp.illusioner.config.ConfigManager; -import com.willfp.illusioner.util.interfaces.Registerable; -import org.bukkit.Bukkit; -import org.bukkit.command.Command; -import org.bukkit.command.CommandExecutor; -import org.bukkit.command.CommandSender; -import org.bukkit.command.PluginCommand; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.NotNull; - -import java.util.Arrays; -import java.util.List; - -public abstract class AbstractCommand implements CommandExecutor, Registerable { - private final String name; - private final String permission; - private final boolean playersOnly; - - protected AbstractCommand(String name, String permission, boolean playersOnly) { - this.name = name; - this.permission = permission; - this.playersOnly = playersOnly; - } - - public AbstractTabCompleter getTab() { - return null; - } - - public String getPermission() { - return this.permission; - } - - public String getName() { - return this.name; - } - - @Override - public boolean onCommand(@NotNull CommandSender sender, Command command, @NotNull String label, String[] args) { - if(!command.getName().equalsIgnoreCase(name)) return false; - - if(playersOnly && !(sender instanceof Player)) { - sender.sendMessage(ConfigManager.getLang().getMessage("not-player")); - return true; - } - - if (!sender.hasPermission(permission) && sender instanceof Player) { - sender.sendMessage(ConfigManager.getLang().getNoPermission()); - return true; - } - - onExecute(sender, Arrays.asList(args)); - - return true; - } - - @Override - public final void register() { - PluginCommand command = Bukkit.getPluginCommand(name); - assert command != null; - command.setExecutor(this); - - AbstractTabCompleter tabCompleter = this.getTab(); - if(tabCompleter != null) { - command.setTabCompleter(tabCompleter); - } - } - - public abstract void onExecute(CommandSender sender, List args); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/command/AbstractTabCompleter.java b/Plugin/src/main/java/com/willfp/illusioner/command/AbstractTabCompleter.java deleted file mode 100644 index 51271bd..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/command/AbstractTabCompleter.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.willfp.illusioner.command; - -import org.bukkit.command.Command; -import org.bukkit.command.CommandSender; -import org.bukkit.command.TabCompleter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.Arrays; -import java.util.List; - -public abstract class AbstractTabCompleter implements TabCompleter { - private final AbstractCommand command; - - public AbstractTabCompleter(AbstractCommand command) { - this.command = command; - } - - @Override - public @Nullable List onTabComplete(@NotNull CommandSender sender, @NotNull Command command, @NotNull String label, @NotNull String[] args) { - if(!command.getName().equalsIgnoreCase(this.command.getName())) - return null; - - if(!sender.hasPermission(this.command.getPermission())) - return null; - - return onTab(sender, Arrays.asList(args)); - } - - public abstract List onTab(CommandSender sender, List args); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIldebug.java b/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIldebug.java deleted file mode 100644 index 18512c5..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIldebug.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.willfp.illusioner.command.commands; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.command.AbstractCommand; -import com.willfp.illusioner.util.internal.Logger; -import org.bukkit.Bukkit; -import org.bukkit.command.CommandSender; -import org.bukkit.entity.Player; - -import java.util.List; - -@SuppressWarnings("unchecked") -public class CommandIldebug extends AbstractCommand { - public CommandIldebug() { - super("ildebug", "illusioner.debug", false); - } - - @Override - public void onExecute(CommandSender sender, List args) { - Logger.info("--------------- BEGIN DEBUG ----------------"); - if(sender instanceof Player) { - Player player = (Player) sender; - player.sendMessage("Held Item: " + player.getInventory().getItemInMainHand().toString()); - Logger.info(""); - - Logger.info("Held Item: " + player.getInventory().getItemInMainHand().toString()); - Logger.info(""); - } - - - Logger.info("Running Version: " + IllusionerPlugin.getInstance().getDescription().getVersion()); - Logger.info(""); - - Logger.info("Server Information: "); - Logger.info("Players Online: " + Bukkit.getServer().getOnlinePlayers().size()); - Logger.info("Bukkit IP: " + Bukkit.getIp()); - Logger.info("Running Version: " + Bukkit.getVersion() + ", Bukkit Version: " + Bukkit.getBukkitVersion() + ", Alt Version: " + Bukkit.getServer().getVersion()); - Logger.info("Motd: " + Bukkit.getServer().getMotd()); - Logger.info("--------------- END DEBUG ----------------"); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIlreload.java b/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIlreload.java deleted file mode 100644 index 0fd5169..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/command/commands/CommandIlreload.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.willfp.illusioner.command.commands; - -import com.willfp.illusioner.command.AbstractCommand; -import com.willfp.illusioner.config.ConfigManager; -import com.willfp.illusioner.util.internal.Loader; -import org.bukkit.command.CommandSender; - -import java.util.List; - -public class CommandIlreload extends AbstractCommand { - public CommandIlreload() { - super("ilreload", "illusioner.reload", false); - } - - @Override - public void onExecute(CommandSender sender, List args) { - Loader.reload(); - sender.sendMessage(ConfigManager.getLang().getMessage("reloaded")); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/config/ConfigManager.java b/Plugin/src/main/java/com/willfp/illusioner/config/ConfigManager.java deleted file mode 100644 index 169d498..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/config/ConfigManager.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.willfp.illusioner.config; - -import com.willfp.illusioner.config.configs.Config; -import com.willfp.illusioner.config.configs.Lang; - -public class ConfigManager { - private static final Lang LANG = new Lang(); - private static final Config CONFIG = new Config(); - - /** - * Update all configs - * Called on /ecoreload - */ - public static void updateConfigs() { - LANG.update(); - CONFIG.update(); - } - - /** - * Get lang.yml - * @return lang.yml - */ - public static Lang getLang() { - return LANG; - } - - /** - * Get config.yml - * @return config.yml - */ - public static Config getConfig() { - return CONFIG; - } -} \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/illusioner/config/UpdatingYamlConfig.java b/Plugin/src/main/java/com/willfp/illusioner/config/UpdatingYamlConfig.java deleted file mode 100644 index 3d35a88..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/config/UpdatingYamlConfig.java +++ /dev/null @@ -1,77 +0,0 @@ -package com.willfp.illusioner.config; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.util.internal.Logger; -import org.bukkit.configuration.InvalidConfigurationException; -import org.bukkit.configuration.file.YamlConfiguration; - -import java.io.BufferedReader; -import java.io.File; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.nio.charset.StandardCharsets; - -public abstract class UpdatingYamlConfig { - public YamlConfiguration config; - public File configFile; - private final String name; - private final boolean removeUnused; - - public UpdatingYamlConfig(String name, boolean removeUnused) { - this.name = name + ".yml"; - this.removeUnused = removeUnused; - init(); - } - - private void init() { - if (!new File(IllusionerPlugin.getInstance().getDataFolder(), name).exists()) { - createFile(); - } - - this.configFile = new File(IllusionerPlugin.getInstance().getDataFolder(), name); - this.config = YamlConfiguration.loadConfiguration(configFile); - - update(); - } - - private void createFile() { - IllusionerPlugin.getInstance().saveResource(name, false); - } - - public void update() { - try { - config.load(configFile); - - InputStream newIn = IllusionerPlugin.getInstance().getResource(name); - if(newIn == null) { - Logger.error(name + " is null?"); - return; - } - BufferedReader reader = new BufferedReader(new InputStreamReader(newIn, StandardCharsets.UTF_8)); - YamlConfiguration newConfig = new YamlConfiguration(); - newConfig.load(reader); - - if(newConfig.getKeys(true).equals(config.getKeys(true))) - return; - - newConfig.getKeys(true).forEach((s -> { - if (!config.getKeys(true).contains(s)) { - config.set(s, newConfig.get(s)); - } - })); - - if(this.removeUnused) { - config.getKeys(true).forEach((s -> { - if(!newConfig.getKeys(true).contains(s)) { - config.set(s, null); - } - })); - } - - config.save(configFile); - } catch (IOException | InvalidConfigurationException e) { - e.printStackTrace(); - } - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/config/configs/Config.java b/Plugin/src/main/java/com/willfp/illusioner/config/configs/Config.java deleted file mode 100644 index 04f177b..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/config/configs/Config.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.willfp.illusioner.config.configs; - -import com.willfp.illusioner.config.UpdatingYamlConfig; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -/** - * Wrapper for config.yml - */ -public class Config extends UpdatingYamlConfig { - public Config() { - super("config", true); - } - - public int getInt(String path) { - return config.getInt(path); - } - - public int getInt(String path, int def) { - return config.getInt(path, def); - } - - public List getInts(String path) { - return config.getIntegerList(path); - } - - public boolean getBool(String path) { - return config.getBoolean(path); - } - - public List getBools(String path) { - return config.getBooleanList(path); - } - - public String getString(String path) { - return config.getString(path); - } - - public List getStrings(String path) { - return config.getStringList(path); - } - - public double getDouble(String path) { - return config.getDouble(path); - } - - public List getDoubles(String path) { - return config.getDoubleList(path); - } - - public ItemStack getItemStack(String path) { - return config.getItemStack(path); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/config/configs/Lang.java b/Plugin/src/main/java/com/willfp/illusioner/config/configs/Lang.java deleted file mode 100644 index b5b156f..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/config/configs/Lang.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.willfp.illusioner.config.configs; - -import com.willfp.illusioner.config.UpdatingYamlConfig; -import com.willfp.illusioner.util.StringUtils; - -import java.util.List; - -/** - * Wrapper for lang.yml - */ -public class Lang extends UpdatingYamlConfig { - public Lang() { - super("lang", false); - } - - public String getString(String path) { - return StringUtils.translate(String.valueOf(config.getString(path))); - } - - public List getStrings(String path) { - return config.getStringList(path); - } - - - public String getPrefix() { - return StringUtils.translate(config.getString("messages.prefix")); - } - - public String getNoPermission() { - return getPrefix() + StringUtils.translate(config.getString("messages.no-permission")); - } - - public String getMessage(String message) { - return getPrefix() + StringUtils.translate(config.getString("messages." + message)); - } -} \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityBuilder.java b/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityBuilder.java deleted file mode 100644 index 29584f1..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityBuilder.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.willfp.illusioner.events.entitydeathbyentity; - -import org.bukkit.Bukkit; -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; - -import java.util.List; - -class EntityDeathByEntityBuilder { - private LivingEntity victim = null; - private Entity damager; - private EntityDeathEvent deathEvent; - - private List drops; - private int xp = 0; - private boolean dropItems; - - public EntityDeathByEntityBuilder() { - - } - - public LivingEntity getVictim() { - return this.victim; - } - - public void setDeathEvent(EntityDeathEvent deathEvent) { - this.deathEvent = deathEvent; - } - - public void setVictim(LivingEntity victim) { - this.victim = victim; - } - - public void setDamager(Entity damager) { - this.damager = damager; - } - - public void setDrops(List drops) { - this.drops = drops; - } - - public void setXp(int xp) { - this.xp = xp; - } - - public void push() { - if(this.victim == null) return; - if(this.damager == null) return; - if(this.drops == null) return; - if(this.deathEvent == null) return; - - EntityDeathByEntityEvent event = new EntityDeathByEntityEvent(victim, damager, drops, xp, deathEvent); - - Bukkit.getPluginManager().callEvent(event); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityEvent.java b/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityEvent.java deleted file mode 100644 index 28e060d..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityEvent.java +++ /dev/null @@ -1,115 +0,0 @@ -package com.willfp.illusioner.events.entitydeathbyentity; - -import org.bukkit.entity.Entity; -import org.bukkit.entity.LivingEntity; -import org.bukkit.event.Event; -import org.bukkit.event.HandlerList; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.NotNull; - -import java.util.List; - -/** - * Event triggered when entity is killed by entity. - */ -public class EntityDeathByEntityEvent extends Event { - private static final HandlerList HANDLERS = new HandlerList(); - - /** - * The {@link LivingEntity} killed - */ - private final LivingEntity victim; - - /** - * The {@link Entity} that killed; - */ - private final Entity damager; - - /** - * The associated {@link EntityDeathEvent} - */ - private final EntityDeathEvent deathEvent; - - /** - * The entity drops - */ - private final List drops; - - /** - * The xp to drop - */ - private final int xp; - - /** - * Create event based off parameters - * - * @param victim The killed entity - * @param damager The killer - * @param drops The item drops - * @param xp The amount of xp to drop - * @param deathEvent The associated {@link EntityDeathEvent} - */ - public EntityDeathByEntityEvent(@NotNull LivingEntity victim, @NotNull Entity damager, @NotNull List drops, int xp, @NotNull EntityDeathEvent deathEvent) { - this.victim = victim; - this.damager = damager; - this.drops = drops; - this.xp = xp; - this.deathEvent = deathEvent; - } - - /** - * Get victim - * - * @return The victim - */ - public LivingEntity getVictim() { - return this.victim; - } - - /** - * Get killer - * - * @return The killer - */ - public Entity getKiller() { - return this.damager; - } - - /** - * Get xp amount - * - * @return The xp - */ - public int getDroppedExp() { - return this.xp; - } - - /** - * Get drops - * - * @return {@link List} of drops - */ - public List getDrops() { - return this.drops; - } - - /** - * Get associated {@link EntityDeathEvent} - * Use this to modify event parameters. - * - * @return The associated {@link EntityDeathEvent} - */ - public EntityDeathEvent getDeathEvent() { - return this.deathEvent; - } - - @Override - public @NotNull HandlerList getHandlers() { - return HANDLERS; - } - - public static HandlerList getHandlerList() { - return HANDLERS; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityListeners.java b/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityListeners.java deleted file mode 100644 index 8f6547f..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/events/entitydeathbyentity/EntityDeathByEntityListeners.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.willfp.illusioner.events.entitydeathbyentity; - -import com.willfp.illusioner.IllusionerPlugin; -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; -import org.bukkit.event.entity.EntityDeathEvent; -import org.bukkit.inventory.ItemStack; -import org.bukkit.scheduler.BukkitRunnable; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import java.util.concurrent.atomic.AtomicReference; - -public class EntityDeathByEntityListeners implements Listener { - - final Set events = new HashSet<>(); - - @EventHandler(priority = EventPriority.HIGH) - public void onEntityDamage(EntityDamageByEntityEvent event) { - if(!(event.getEntity() instanceof LivingEntity)) return; - - LivingEntity victim = (LivingEntity) event.getEntity(); - - if(victim.getHealth() > event.getFinalDamage()) return; - - EntityDeathByEntityBuilder builtEvent = new EntityDeathByEntityBuilder(); - builtEvent.setVictim(victim); - builtEvent.setDamager(event.getDamager()); - events.add(builtEvent); - - new BukkitRunnable() { - @Override - public void run() { - events.remove(builtEvent); - } - }.runTaskLater(IllusionerPlugin.getInstance(), 1); - } - - @EventHandler - public void onEntityDeath(EntityDeathEvent event) { - LivingEntity victim = event.getEntity(); - - List drops = event.getDrops(); - int xp = event.getDroppedExp(); - - AtomicReference atomicBuiltEvent = new AtomicReference<>(null); - EntityDeathByEntityBuilder builtEvent; - - events.forEach((deathByEntityEvent) -> { - if(deathByEntityEvent.getVictim().equals(victim)) { - atomicBuiltEvent.set(deathByEntityEvent); - } - }); - - if(atomicBuiltEvent.get() == null) return; - - builtEvent = atomicBuiltEvent.get(); - events.remove(builtEvent); - builtEvent.setDrops(drops); - builtEvent.setXp(xp); - builtEvent.setDeathEvent(event); - - builtEvent.push(); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java b/Plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java deleted file mode 100644 index cf86fb9..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.willfp.illusioner.illusioner; - -import org.bukkit.Material; - -public class BlockStructure { - private final Material bottom; - private final Material middle; - private final Material top; - - public BlockStructure(Material bottom, Material middle, Material top) { - this.bottom = bottom; - this.middle = middle; - this.top = top; - } - - public Material getBottom() { - return bottom; - } - - public Material getMiddle() { - return middle; - } - - public Material getTop() { - return top; - } - - public static boolean matches(BlockStructure structure) { - return structure.getBottom().equals(IllusionerManager.OPTIONS.getSpawnStructure().getBottom()) - && structure.getMiddle().equals(IllusionerManager.OPTIONS.getSpawnStructure().getMiddle()) - && structure.getTop().equals(IllusionerManager.OPTIONS.getSpawnStructure().getTop()); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java b/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java deleted file mode 100644 index 62b4565..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.willfp.illusioner.illusioner.listeners; - -import com.willfp.illusioner.events.entitydeathbyentity.EntityDeathByEntityEvent; -import com.willfp.illusioner.illusioner.IllusionerManager; -import com.willfp.illusioner.integrations.ecoenchants.EcoEnchantsManager; -import org.bukkit.entity.EntityType; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; - -public class DeathListeners implements Listener { - @EventHandler - public void onIllusionerDeath(EntityDeathByEntityEvent event) { - if(!event.getDeathEvent().getEntityType().equals(EntityType.ILLUSIONER)) - return; - - IllusionerManager.OPTIONS.getDeathSounds().forEach(optionedSound -> { - if(optionedSound.isBroadcast()) { - event.getKiller().getWorld().playSound(event.getVictim().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); - } else { - if(event.getKiller() instanceof Player) { - ((Player) event.getKiller()).playSound(event.getVictim().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); - } - } - }); - - IllusionerManager.OPTIONS.getDrops().forEach(drop -> { - if(event.getKiller() instanceof Player) { - if (EcoEnchantsManager.isRegistered()) { - EcoEnchantsManager.dropQueueItems((Player) event.getKiller(), event.getVictim().getLocation(), drop); - return; - } - } - event.getVictim().getLocation().getWorld().dropItemNaturally(event.getVictim().getLocation(), drop); - }); - - event.getDeathEvent().setDroppedExp(IllusionerManager.OPTIONS.generateXp()); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java b/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java deleted file mode 100644 index f768b15..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.willfp.illusioner.illusioner.listeners; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.illusioner.BlockStructure; -import com.willfp.illusioner.illusioner.IllusionerManager; -import com.willfp.illusioner.nms.NMSIllusioner; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import org.bukkit.Material; -import org.bukkit.block.Block; -import org.bukkit.entity.Illusioner; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.block.BlockPlaceEvent; -import org.bukkit.event.entity.EntitySpawnEvent; - -import java.util.HashSet; -import java.util.Set; - -public class SpawnListeners implements Listener { - @EventHandler - public void onSpawn(BlockPlaceEvent event) { - boolean matches = false; - Set match = new HashSet<>(); - for(int i = 0; i < 3; i++) { - Block block1; - Block block2; - Block block3; - - if(i == 0) { - block3 = event.getBlock(); - block2 = event.getBlock().getRelative(0, -1, 0); - block1 = event.getBlock().getRelative(0, -2, 0); - } else if(i == 1) { - block1 = event.getBlock(); - block2 = event.getBlock().getRelative(0, 1, 0); - block3 = event.getBlock().getRelative(0, 2, 0); - } else { - block2 = event.getBlock(); - block1 = event.getBlock().getRelative(0, -1, 0); - block3 = event.getBlock().getRelative(0, 1, 0); - } - - matches = BlockStructure.matches(new BlockStructure(block1.getType(), block2.getType(), block3.getType())); - if(matches) { - match.add(block1); - match.add(block2); - match.add(block3); - break; - } - } - - if(!matches) - return; - - match.forEach(block -> block.setType(Material.AIR)); - IllusionerManager.OPTIONS.getSpawnSounds().forEach(optionedSound -> { - if(optionedSound.isBroadcast()) { - event.getBlock().getWorld().playSound(event.getBlock().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); - } else { - event.getPlayer().playSound(event.getBlock().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); - } - }); - - EntityIllusionerWrapper illusioner = NMSIllusioner.spawn(event.getBlock().getLocation(), IllusionerManager.OPTIONS.getMaxHealth(), IllusionerManager.OPTIONS.getAttackDamage(), IllusionerManager.OPTIONS.getName()); - illusioner.createBossbar(IllusionerPlugin.getInstance(), IllusionerManager.OPTIONS.getColor(), IllusionerManager.OPTIONS.getStyle()); - } - - @EventHandler - public void onExternalSpawn(EntitySpawnEvent event) { - if(!(event.getEntity() instanceof Illusioner)) - return; - - if(!IllusionerManager.OPTIONS.isOverride()) - return; - - Illusioner illusioner = (Illusioner) event.getEntity(); - EntityIllusionerWrapper internalIllusioner = NMSIllusioner.convertIllusioner(illusioner, IllusionerManager.OPTIONS.getMaxHealth(), IllusionerManager.OPTIONS.getAttackDamage(), IllusionerManager.OPTIONS.getName()); - if(internalIllusioner == null) return; - internalIllusioner.createBossbar(IllusionerPlugin.getInstance(), IllusionerManager.OPTIONS.getColor(), IllusionerManager.OPTIONS.getStyle()); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java b/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java deleted file mode 100644 index e0b0130..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java +++ /dev/null @@ -1,135 +0,0 @@ -package com.willfp.illusioner.illusioner.options; - -import com.willfp.illusioner.config.ConfigManager; -import com.willfp.illusioner.util.internal.OptionedSound; -import org.bukkit.Sound; -import org.bukkit.entity.EntityType; -import org.bukkit.potion.PotionEffectType; - -import java.util.HashSet; -import java.util.Set; - -public class GameplayOptions { - private OptionedSound hitSound; - private OptionedSound summonSound; - - private final Set effectOptions = new HashSet<>(); - private final Set summonerOptions = new HashSet<>(); - - private boolean shuffle; - private double shuffleChance; - - private boolean ignoreExplosionDamage; - - public void reload() { - hitSound = new OptionedSound( - Sound.valueOf(ConfigManager.getConfig().getString("sounds.hit.sound")), - (float) ConfigManager.getConfig().getDouble("sounds.hit.volume"), - (float) ConfigManager.getConfig().getDouble("sounds.hit.pitch"), - ConfigManager.getConfig().getBool("sounds.hit.broadcast") - ); - - summonSound = new OptionedSound( - Sound.valueOf(ConfigManager.getConfig().getString("sounds.summon.sound")), - (float) ConfigManager.getConfig().getDouble("sounds.summon.volume"), - (float) ConfigManager.getConfig().getDouble("sounds.summon.pitch"), - ConfigManager.getConfig().getBool("sounds.summon.broadcast") - ); - - shuffle = ConfigManager.getConfig().getBool("attacks.shuffle.enabled"); - shuffleChance = ConfigManager.getConfig().getDouble("attacks.shuffle.chance"); - ignoreExplosionDamage = ConfigManager.getConfig().getBool("ignore-explosion-damage"); - - effectOptions.clear(); - ConfigManager.getConfig().config.getConfigurationSection("attacks.effects").getKeys(false).forEach(key -> { - PotionEffectType type = PotionEffectType.getByName(ConfigManager.getConfig().getString("attacks.effects." + key + ".type")); - int level = ConfigManager.getConfig().getInt("attacks.effects." + key + ".level"); - int duration = ConfigManager.getConfig().getInt("attacks.effects." + key + ".duration"); - double chance = ConfigManager.getConfig().getDouble("attacks.effects." + key + ".chance"); - effectOptions.add(new EffectOption(chance, level, duration, type)); - }); - - summonerOptions.clear(); - ConfigManager.getConfig().config.getConfigurationSection("attacks.summons").getKeys(false).forEach(key -> { - EntityType type = EntityType.valueOf(ConfigManager.getConfig().getString("attacks.summons." + key + ".type")); - double chance = ConfigManager.getConfig().getDouble("attacks.summons." + key + ".chance"); - summonerOptions.add(new SummonerOption(chance, type)); - }); - } - - public OptionedSound getHitSound() { - return hitSound; - } - - public OptionedSound getSummonSound() { - return summonSound; - } - - public Set getEffectOptions() { - return effectOptions; - } - - public Set getSummonerOptions() { - return summonerOptions; - } - - public double getShuffleChance() { - return shuffleChance; - } - - public boolean isShuffle() { - return shuffle; - } - - public boolean isIgnoreExplosionDamage() { - return ignoreExplosionDamage; - } - - public static class EffectOption { - private final double chance; - private final int level; - private final PotionEffectType effectType; - private final int duration; - - public EffectOption(double chance, int level, int duration, PotionEffectType effectType) { - this.chance = chance; - this.level = level; - this.effectType = effectType; - this.duration = duration; - } - - public double getChance() { - return chance; - } - - public int getLevel() { - return level; - } - - public PotionEffectType getEffectType() { - return effectType; - } - - public int getDuration() { - return duration; - } - } - - public static class SummonerOption { - private final double chance; - private final EntityType type; - - public SummonerOption(double chance, EntityType type) { - this.chance = chance; - this.type = type; - } - - public double getChance() { - return chance; - } - - public EntityType getType() { - return type; - } - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java b/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java deleted file mode 100644 index b43ad4d..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java +++ /dev/null @@ -1,124 +0,0 @@ -package com.willfp.illusioner.illusioner.options; - -import com.willfp.illusioner.config.ConfigManager; -import com.willfp.illusioner.illusioner.BlockStructure; -import com.willfp.illusioner.util.NumberUtils; -import com.willfp.illusioner.util.internal.OptionedSound; -import com.willfp.illusioner.util.tuplets.Pair; -import org.bukkit.Material; -import org.bukkit.Sound; -import org.bukkit.boss.BarColor; -import org.bukkit.boss.BarStyle; -import org.bukkit.inventory.ItemStack; - -import java.util.HashSet; -import java.util.Set; - -public class IllusionerOptions { - private BarColor color; - private BarStyle style; - private String name; - private Set spawnSounds; - private Set deathSounds; - private Pair xpBounds; - private BlockStructure spawnStructure; - private double maxHealth; - private double attackDamage; - private Set drops; - private final GameplayOptions gameplayOptions = new GameplayOptions(); - private boolean override; - - public IllusionerOptions() { - reload(); - } - - public void reload() { - color = BarColor.valueOf(ConfigManager.getConfig().getString("bossbar.color")); - style = BarStyle.valueOf(ConfigManager.getConfig().getString("bossbar.style")); - name = ConfigManager.getConfig().getString("name"); - xpBounds = new Pair<>(ConfigManager.getConfig().getInt("xp.minimum"), ConfigManager.getConfig().getInt("xp.maximum")); - maxHealth = ConfigManager.getConfig().getDouble("max-health"); - attackDamage = ConfigManager.getConfig().getDouble("attack-damage"); - override = ConfigManager.getConfig().getBool("override"); - - spawnSounds = new HashSet<>(); - ConfigManager.getConfig().config.getConfigurationSection("sounds.spawn").getKeys(false).forEach(key -> { - Sound sound = Sound.valueOf(ConfigManager.getConfig().getString("sounds.spawn." + key + ".sound")); - boolean broadcast = ConfigManager.getConfig().getBool("sounds.spawn." + key + ".broadcast"); - float volume = (float) ConfigManager.getConfig().getDouble("sounds.spawn." + key + ".volume"); - float pitch = (float) ConfigManager.getConfig().getDouble("sounds.spawn." + key + ".pitch"); - spawnSounds.add(new OptionedSound(sound, volume, pitch, broadcast)); - }); - - deathSounds = new HashSet<>(); - ConfigManager.getConfig().config.getConfigurationSection("sounds.death").getKeys(false).forEach(key -> { - Sound sound = Sound.valueOf(ConfigManager.getConfig().getString("sounds.death." + key + ".sound")); - boolean broadcast = ConfigManager.getConfig().getBool("sounds.death." + key + ".broadcast"); - float volume = (float) ConfigManager.getConfig().getDouble("sounds.death." + key + ".volume"); - float pitch = (float) ConfigManager.getConfig().getDouble("sounds.death." + key + ".pitch"); - deathSounds.add(new OptionedSound(sound, volume, pitch, broadcast)); - }); - - spawnStructure = new BlockStructure( - Material.valueOf(ConfigManager.getConfig().getString("spawn.bottom-block")), - Material.valueOf(ConfigManager.getConfig().getString("spawn.middle-block")), - Material.valueOf(ConfigManager.getConfig().getString("spawn.top-block")) - ); - - gameplayOptions.reload(); - - drops = new HashSet<>(); - ConfigManager.getConfig().config.getConfigurationSection("drops").getKeys(false).forEach(key -> { - ItemStack itemStack = ConfigManager.getConfig().getItemStack("drops." + key); - drops.add(itemStack); - }); - } - - public BarColor getColor() { - return color; - } - - public BarStyle getStyle() { - return style; - } - - public String getName() { - return name; - } - - public Set getSpawnSounds() { - return spawnSounds; - } - - public Set getDeathSounds() { - return deathSounds; - } - - public int generateXp() { - return NumberUtils.randInt(xpBounds.getFirst(), xpBounds.getSecond()); - } - - public BlockStructure getSpawnStructure() { - return spawnStructure; - } - - public double getMaxHealth() { - return maxHealth; - } - - public double getAttackDamage() { - return attackDamage; - } - - public Set getDrops() { - return drops; - } - - public GameplayOptions getGameplayOptions() { - return gameplayOptions; - } - - public boolean isOverride() { - return override; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/integrations/Integration.java b/Plugin/src/main/java/com/willfp/illusioner/integrations/Integration.java deleted file mode 100644 index b1d33f7..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/integrations/Integration.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.willfp.illusioner.integrations; - -public interface Integration { - String getPluginName(); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsIntegration.java b/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsIntegration.java deleted file mode 100644 index 340deb5..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsIntegration.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.willfp.illusioner.integrations.ecoenchants; - -import com.willfp.illusioner.integrations.Integration; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public interface EcoEnchantsIntegration extends Integration { - void dropItems(Player player, Location location, ItemStack itemStack); - void dropExp(Player player, Location location, double amount); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsManager.java b/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsManager.java deleted file mode 100644 index 8d19359..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/EcoEnchantsManager.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.willfp.illusioner.integrations.ecoenchants; - -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -import java.util.Arrays; -import java.util.HashSet; -import java.util.Set; - -public class EcoEnchantsManager { - private static final Set integrations = new HashSet<>(); - - public static void register(EcoEnchantsIntegration integration) { - integrations.add(integration); - } - - public static void dropQueueItems(Player player, Location location, ItemStack... items) { - Arrays.stream(items).forEach(item -> integrations.forEach(integration -> integration.dropItems(player, location, item))); - } - - public static void dropQueueExp(Player player, Location location, double amount) { - integrations.forEach(integration -> integration.dropExp(player, location, amount)); - } - - public static boolean isRegistered() { - return !integrations.isEmpty(); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/plugins/EcoEnchantsIntegrationImpl.java b/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/plugins/EcoEnchantsIntegrationImpl.java deleted file mode 100644 index f52478e..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/integrations/ecoenchants/plugins/EcoEnchantsIntegrationImpl.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.willfp.illusioner.integrations.ecoenchants.plugins; - -import com.willfp.ecoenchants.util.internal.DropQueue; -import com.willfp.illusioner.integrations.ecoenchants.EcoEnchantsIntegration; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; - -public class EcoEnchantsIntegrationImpl implements EcoEnchantsIntegration { - @Override - public void dropItems(Player player, Location location, ItemStack itemStack) { - new DropQueue(player) - .setLocation(location) - .addItem(itemStack) - .push(); - } - - @Override - public void dropExp(Player player, Location location, double amount) { - new DropQueue(player) - .setLocation(location) - .addXP((int) Math.ceil(amount)) - .push(); - } - - @Override - public String getPluginName() { - return "EcoEnchants"; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/nms/NMSIllusioner.java b/Plugin/src/main/java/com/willfp/illusioner/nms/NMSIllusioner.java deleted file mode 100644 index 819f5bd..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/nms/NMSIllusioner.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.willfp.illusioner.nms; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import com.willfp.illusioner.nms.api.IllusionerWrapper; -import org.bukkit.Location; -import org.bukkit.entity.Illusioner; -import org.jetbrains.annotations.ApiStatus; - -/** - * Utility class to manage NMS illusioner - */ -public class NMSIllusioner { - private static IllusionerWrapper illusionerWrapper; - - @ApiStatus.Internal - public static boolean init() { - try { - final Class class2 = Class.forName("com.willfp.illusioner." + IllusionerPlugin.NMS_VERSION + ".Illusioner"); - if (IllusionerWrapper.class.isAssignableFrom(class2)) { - illusionerWrapper = (IllusionerWrapper) class2.getConstructor().newInstance(); - } - } catch (Exception e) { - e.printStackTrace(); - illusionerWrapper = null; - } - return illusionerWrapper != null; - } - - /** - * Spawn a new Illusioner Boss - * - * @param location The location to spawn it at - * @param maxHealth The max health for the illusioner to have - * @param attackDamage The attack damage for the illusioner - * @param name The name of the illusioner - * @return The illusioner - */ - public static EntityIllusionerWrapper spawn(Location location, double maxHealth, double attackDamage, String name) { - assert illusionerWrapper != null; - return illusionerWrapper.spawn(location, maxHealth, attackDamage, name); - } - - /** - * Adapt an existing Illusioner into an Illusioner boss - * - * @param illusioner The Illusioner to adapt - * @param maxHealth The max health for the illusioner to have - * @param attackDamage The attack damage for the illusioner - * @param name The name of the Illusioner - * @return The illusioner - */ - public static EntityIllusionerWrapper convertIllusioner(Illusioner illusioner, double maxHealth, double attackDamage, String name) { - assert illusionerWrapper != null; - return illusionerWrapper.adapt(illusioner, illusioner.getLocation(), maxHealth, attackDamage, name); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/NumberUtils.java b/Plugin/src/main/java/com/willfp/illusioner/util/NumberUtils.java deleted file mode 100644 index b447c90..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/NumberUtils.java +++ /dev/null @@ -1,148 +0,0 @@ -package com.willfp.illusioner.util; - -import java.text.DecimalFormat; -import java.util.TreeMap; - -public class NumberUtils { - - private final static TreeMap NUMERALS = new TreeMap<>(); - - static { - - NUMERALS.put(1000, "M"); - NUMERALS.put(900, "CM"); - NUMERALS.put(500, "D"); - NUMERALS.put(400, "CD"); - NUMERALS.put(100, "C"); - NUMERALS.put(90, "XC"); - NUMERALS.put(50, "L"); - NUMERALS.put(40, "XL"); - NUMERALS.put(10, "X"); - NUMERALS.put(9, "IX"); - NUMERALS.put(5, "V"); - NUMERALS.put(4, "IV"); - NUMERALS.put(1, "I"); - - } - - /** - * Bias the input value according to a curve - * - * @param input The input value - * @param bias The bias between -1 and 1, where higher values bias input values to lower output values - * @return The biased output - */ - public static double bias(double input, double bias) { - double k = Math.pow(1 - bias, 3); - - return (input * k) / (input * k - input + 1); - } - - /** - * If value is above maximum, set it to maximum - * - * @param toChange The value to test - * @param limit The maximum - * @return The new value - */ - public static int equalIfOver(int toChange, int limit) { - if (toChange > limit) { - toChange = limit; - } - return toChange; - } - - /** - * If value is above maximum, set it to maximum - * - * @param toChange The value to test - * @param limit The maximum - * @return The new value - */ - public static double equalIfOver(double toChange, double limit) { - if (toChange > limit) { - toChange = limit; - } - return toChange; - } - - /** - * Get Roman Numeral from number - * - * @param number The number to convert - * @return The number, converted to a roman numeral - */ - public static String toNumeral(int number) { - if (number >= 1 && number <= 4096) { - int l = NUMERALS.floorKey(number); - if (number == l) { - return NUMERALS.get(number); - } - return NUMERALS.get(l) + toNumeral(number - l); - } else return String.valueOf(number); - } - - /** - * Generate random integer in range - * - * @param min Minimum - * @param max Maximum - * @return Random integer - */ - public static int randInt(int min, int max) { - return (int) ((long) min + Math.random() * ((long) max - min + 1)); - } - - /** - * Generate random double in range - * - * @param min Minimum - * @param max Maximum - * @return Random double - */ - public static double randFloat(double min, double max) { - java.util.Random rand = new java.util.Random(); - return rand.nextFloat() * (max - min) + min; - } - - /** - * Generate random double with a triangular distribution - * - * @param minimum Minimum - * @param maximum Maximum - * @param peak Peak - * @return Random double - */ - public static double triangularDistribution(double minimum, double maximum, double peak) { - double F = (peak - minimum) / (maximum - minimum); - double rand = Math.random(); - if (rand < F) { - return minimum + Math.sqrt(rand * (maximum - minimum) * (peak - minimum)); - } else { - return maximum - Math.sqrt((1 - rand) * (maximum - minimum) * (maximum - peak)); - } - } - - /** - * Get Log base 2 of a number - * - * @param N The number - * @return The result - */ - public static int log2(int N) { - return (int) (Math.log(N) / Math.log(2)); - } - - /** - * Format double to string - * - * @param toFormat The number to format - * @return Formatted - */ - public static String format(double toFormat) { - DecimalFormat df = new DecimalFormat("0.00"); - String formatted = df.format(toFormat); - - return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/StringUtils.java b/Plugin/src/main/java/com/willfp/illusioner/util/StringUtils.java deleted file mode 100644 index 9230b28..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/StringUtils.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.willfp.illusioner.util; - -import net.md_5.bungee.api.ChatColor; -import org.bukkit.entity.Player; -import org.jetbrains.annotations.Nullable; - -import java.util.Collection; -import java.util.regex.Matcher; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import static net.md_5.bungee.api.ChatColor.COLOR_CHAR; - -public class StringUtils { - /** - * Translate a string - converts Placeholders and Color codes - * - * @param message The message to translate - * @param player The player to translate placeholders with respect to - * @return The message, translated - */ - public static String translate(String message, @Nullable Player player) { - message = translateHexColorCodes(message); - message = ChatColor.translateAlternateColorCodes('&', message); - return ChatColor.translateAlternateColorCodes('&', translateHexColorCodes(message)); - } - - /** - * Translate a string without respect to a player - * - * @param message The message to translate - * @return The message, translated - * @see StringUtils#translate(String, Player) - */ - public static String translate(String message) { - message = translateHexColorCodes(message); - message = ChatColor.translateAlternateColorCodes('&', message); - return ChatColor.translateAlternateColorCodes('&', translateHexColorCodes(message)); - } - - private static String translateHexColorCodes(String message) { - Pattern hexPattern = Pattern.compile("&#" + "([A-Fa-f0-9]{6})" + ""); - Matcher matcher = hexPattern.matcher(message); - StringBuffer buffer = new StringBuffer(message.length() + 4 * 8); - while (matcher.find()) { - String group = matcher.group(1); - matcher.appendReplacement(buffer, COLOR_CHAR + "x" - + COLOR_CHAR + group.charAt(0) + COLOR_CHAR + group.charAt(1) - + COLOR_CHAR + group.charAt(2) + COLOR_CHAR + group.charAt(3) - + COLOR_CHAR + group.charAt(4) + COLOR_CHAR + group.charAt(5)); - } - - return matcher.appendTail(buffer).toString(); - } - - /** - * Internal implementation of {@link String#valueOf} - * Formats collections and doubles better - * - * @param object The object to convert to string - * @return The object stringified - */ - public static String internalToString(@Nullable Object object) { - if (object == null) return "null"; - - if (object instanceof Integer) { - return ((Integer) object).toString(); - } else if (object instanceof String) { - return (String) object; - } else if (object instanceof Double) { - return NumberUtils.format((Double) object); - } else if (object instanceof Collection) { - Collection c = (Collection) object; - return c.stream().map(String::valueOf).collect(Collectors.joining(", ")); - } else return String.valueOf(object); - } - - /** - * Remove a string of characters from the start of a string - * - * @param s The string to remove the prefix from - * @param prefix The substring to remove - * @return The string with the prefix removed - */ - public static String removePrefix(String s, String prefix) { - if (s != null && prefix != null && s.startsWith(prefix)) { - return s.substring(prefix.length()); - } - return s; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Callable.java b/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Callable.java deleted file mode 100644 index 4d77fc7..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Callable.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.willfp.illusioner.util.interfaces; - -/** - * Simple functional interface to run some code on demand - */ -@FunctionalInterface -public interface Callable { - void call(); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Registerable.java b/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Registerable.java deleted file mode 100644 index 39f4406..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/interfaces/Registerable.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.willfp.illusioner.util.interfaces; - -/** - * Interface for objects that can be internally registered - */ -public interface Registerable { - void register(); -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/internal/Loader.java b/Plugin/src/main/java/com/willfp/illusioner/util/internal/Loader.java deleted file mode 100644 index b3e204a..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/internal/Loader.java +++ /dev/null @@ -1,181 +0,0 @@ -package com.willfp.illusioner.util.internal; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.command.commands.CommandIldebug; -import com.willfp.illusioner.command.commands.CommandIlreload; -import com.willfp.illusioner.config.ConfigManager; -import com.willfp.illusioner.illusioner.IllusionerManager; -import com.willfp.illusioner.illusioner.listeners.AttackListeners; -import com.willfp.illusioner.illusioner.listeners.DeathListeners; -import com.willfp.illusioner.illusioner.listeners.SpawnListeners; -import com.willfp.illusioner.integrations.ecoenchants.EcoEnchantsManager; -import com.willfp.illusioner.integrations.ecoenchants.plugins.EcoEnchantsIntegrationImpl; -import com.willfp.illusioner.nms.NMSIllusioner; -import com.willfp.illusioner.util.interfaces.Callable; -import com.willfp.illusioner.util.internal.updater.PlayerJoinListener; -import com.willfp.illusioner.util.internal.updater.UpdateChecker; -import org.apache.maven.artifact.versioning.DefaultArtifactVersion; -import org.bstats.bukkit.Metrics; -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; - -import java.util.Arrays; -import java.util.HashMap; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * Class containing methods for the loading and unloading of Illusioner - */ -public class Loader { - - /** - * Called by {@link IllusionerPlugin#onEnable()} - */ - public static void load() { - Logger.info("=========================================="); - Logger.info(""); - Logger.info("Loading &9Illusioner"); - Logger.info("Made by &9Auxilor&f - willfp.com"); - Logger.info(""); - Logger.info("=========================================="); - - /* - Load Configs - */ - - Logger.info("Loading Configs..."); - ConfigManager.updateConfigs(); - Logger.info(""); - - /* - Load NMS - */ - - Logger.info("Loading NMS APIs..."); - - if (NMSIllusioner.init()) { - Logger.info("NMS Illusioner: &aSUCCESS"); - } else { - Logger.info("NMS Illusioner: &cFAILURE"); - Logger.error("&cAborting..."); - Bukkit.getPluginManager().disablePlugin(IllusionerPlugin.getInstance()); - } - - Logger.info(""); - - /* - Register Integrations - */ - Logger.info("Loading Integrations..."); - - final HashMap integrations = new HashMap() {{ - put("EcoEnchants", () -> EcoEnchantsManager.register(new EcoEnchantsIntegrationImpl())); - }}; - - Set enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toSet()); - - integrations.forEach(((s, callable) -> { - StringBuilder log = new StringBuilder(); - log.append(s).append(": "); - if (enabledPlugins.contains(s)) { - callable.call(); - log.append("&aENABLED"); - } else { - log.append("&9DISABLED"); - } - Logger.info(log.toString()); - })); - - Logger.info(""); - - /* - Register Events - */ - - Logger.info("Registering Events..."); - Bukkit.getPluginManager().registerEvents(new PlayerJoinListener(), IllusionerPlugin.getInstance()); - Bukkit.getPluginManager().registerEvents(new AttackListeners(), IllusionerPlugin.getInstance()); - Bukkit.getPluginManager().registerEvents(new DeathListeners(), IllusionerPlugin.getInstance()); - Bukkit.getPluginManager().registerEvents(new SpawnListeners(), IllusionerPlugin.getInstance()); - Logger.info(""); - - /* - Register options - */ - Logger.info("Loading options..."); - IllusionerManager.OPTIONS.reload(); - Logger.info(""); - - /* - Load Commands - */ - - Logger.info("Loading Commands..."); - new CommandIlreload().register(); - new CommandIldebug().register(); - Logger.info(""); - - /* - Start bStats - */ - - Logger.info("Hooking into bStats..."); - new Metrics(IllusionerPlugin.getInstance(), 9596); - Logger.info(""); - - /* - Finish - */ - - Bukkit.getScheduler().runTaskLater(IllusionerPlugin.getInstance(), Loader::postLoad, 1); - - Logger.info("Loaded &9Illusioner!"); - } - - /** - * Called after server is loaded - */ - public static void postLoad() { - new UpdateChecker(IllusionerPlugin.getInstance(), 86576).getVersion((version) -> { - DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(IllusionerPlugin.getInstance().getDescription().getVersion()); - DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version); - Logger.info("----------------------------"); - Logger.info(""); - Logger.info("Illusioner Updater"); - Logger.info(""); - if (currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion)) { - Logger.info("&aIllusioner is up to date! (Version " + IllusionerPlugin.getInstance().getDescription().getVersion() + ")"); - } else { - UpdateChecker.setOutdated(true); - UpdateChecker.setNewVersion(version); - - Bukkit.getScheduler().runTaskTimer(IllusionerPlugin.getInstance(), () -> { - Logger.info("&6Illusioner is out of date! (Version " + IllusionerPlugin.getInstance().getDescription().getVersion() + ")"); - Logger.info("&6The newest version is &f" + version); - Logger.info("&6Download the new version here: &fhttps://www.spigotmc.org/resources/illusioner.79573/"); - }, 0, 864000); - } - Logger.info(""); - Logger.info("----------------------------"); - }); - - Logger.info(""); - } - - /** - * Called by {@link IllusionerPlugin#onDisable()} - */ - public static void unload() { - Logger.info("&cDisabling Illusioner..."); - Logger.info("&fBye! :)"); - } - - /** - * Called by /ecoreload - */ - public static void reload() { - ConfigManager.updateConfigs(); - IllusionerManager.OPTIONS.reload(); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/internal/Logger.java b/Plugin/src/main/java/com/willfp/illusioner/util/internal/Logger.java deleted file mode 100644 index 48f534a..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/internal/Logger.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.willfp.illusioner.util.internal; - -import com.willfp.illusioner.IllusionerPlugin; -import com.willfp.illusioner.util.StringUtils; - -/** - * The internal logger for Illusioner - * Automatically formats all inputs using {@link StringUtils#translate(String)} - */ -public class Logger { - private static final IllusionerPlugin INSTANCE = IllusionerPlugin.getInstance(); - - /** - * Print an info (neutral) message to console - * - * @param message The message to send - */ - public static void info(String message) { - INSTANCE.getLogger().info(StringUtils.translate(message)); - } - - /** - * Print a warning to console - * - * @param message The warning - */ - public static void warn(String message) { - INSTANCE.getLogger().warning(StringUtils.translate(message)); - } - - /** - * Print an error to console - * - * @param message The error - */ - public static void error(String message) { - INSTANCE.getLogger().severe(StringUtils.translate(message)); - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/internal/OptionedSound.java b/Plugin/src/main/java/com/willfp/illusioner/util/internal/OptionedSound.java deleted file mode 100644 index b907813..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/internal/OptionedSound.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.willfp.illusioner.util.internal; - -import org.bukkit.Sound; - -public class OptionedSound { - private final Sound sound; - private final float volume; - private final float pitch; - private final boolean broadcast; - - public OptionedSound(Sound sound, float volume, float pitch, boolean broadcast) { - this.sound = sound; - this.volume = volume; - this.pitch = pitch; - this.broadcast = broadcast; - } - - public Sound getSound() { - return sound; - } - - public float getVolume() { - return volume; - } - - public float getPitch() { - return pitch; - } - - public boolean isBroadcast() { - return broadcast; - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/PlayerJoinListener.java b/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/PlayerJoinListener.java deleted file mode 100644 index 9b8fae2..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/PlayerJoinListener.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.willfp.illusioner.util.internal.updater; - -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; -import org.bukkit.event.player.PlayerJoinEvent; - -public class PlayerJoinListener implements Listener { - @EventHandler - public void onPlayerJoin(PlayerJoinEvent event) { - /* - if (UpdateChecker.isOutdated()) { - if (event.getPlayer().hasPermission("illusioner.updateannounce")) { - event.getPlayer().sendMessage(ConfigManager.getLang().getMessage("outdated").replace("%ver%", IllusionerPlugin.getInstance().getDescription().getVersion()) - .replace("%newver%", UpdateChecker.getNewVersion())); - } - } - */ - } -} diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/UpdateChecker.java b/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/UpdateChecker.java deleted file mode 100644 index 5a0f86d..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/internal/updater/UpdateChecker.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.willfp.illusioner.util.internal.updater; - -import org.bukkit.Bukkit; -import org.bukkit.plugin.Plugin; -import org.bukkit.util.Consumer; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; -import java.util.Scanner; - -/** - * Checks spigot if the plugin is out of date - */ -public class UpdateChecker { - private static boolean outdated; - private static String newVersion; - - private final Plugin plugin; - private final int resourceId; - - /** - * Create an update checker for the specified spigot resource id - * - * @param plugin The plugin to check - * @param resourceId The resource ID of the plugin - */ - public UpdateChecker(Plugin plugin, int resourceId) { - this.plugin = plugin; - this.resourceId = resourceId; - } - - /** - * Get the latest version of the plugin - * - * @param consumer The process to run after checking - */ - public void getVersion(final Consumer consumer) { - Bukkit.getScheduler().runTaskAsynchronously(this.plugin, () -> { - try (InputStream inputStream = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.resourceId).openStream(); Scanner scanner = new Scanner(inputStream)) { - if (scanner.hasNext()) { - consumer.accept(scanner.next()); - } - } catch (IOException exception) { - this.plugin.getLogger().warning("Failed to check for Illusioner updates: " + exception.getMessage()); - } - }); - } - - /** - * Get if the plugin is outdated - * - * @return If the plugin is outdated - */ - public static boolean isOutdated() { - return outdated; - } - - /** - * Get the newest available version of the plugin - * - * @return The latest version - */ - public static String getNewVersion() { - return newVersion; - } - - /** - * Mark the plugin as outdated or not - * - * @param outdated Whether the plugin is outdated - */ - public static void setOutdated(boolean outdated) { - UpdateChecker.outdated = outdated; - } - - /** - * Set the newest available version of the plugin - * - * @param newVersion The newest version - */ - public static void setNewVersion(String newVersion) { - UpdateChecker.newVersion = newVersion; - } -} - \ No newline at end of file diff --git a/Plugin/src/main/java/com/willfp/illusioner/util/tuplets/Pair.java b/Plugin/src/main/java/com/willfp/illusioner/util/tuplets/Pair.java deleted file mode 100644 index 97955c3..0000000 --- a/Plugin/src/main/java/com/willfp/illusioner/util/tuplets/Pair.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.willfp.illusioner.util.tuplets; - -/** - * Spigot doesn't include javafx - */ -public class Pair { - private A first; - private B second; - - /** - * Create a pair - * - * @param first The first item in the tuplet - * @param second The second item in the tuplet - */ - public Pair(A first, B second) { - this.first = first; - this.second = second; - } - - /** - * Get the first item in the tuplet - * - * @return The first item - */ - public A getFirst() { - return first; - } - - /** - * Get the second item in the tuplet - * - * @return The second item - */ - public B getSecond() { - return second; - } - - /** - * Set the first item in the tuplet - * - * @param first The value to set the first item to - */ - public void setFirst(A first) { - this.first = first; - } - - /** - * Set the second item in the tuplet - * - * @param second The value to set the second item to - */ - public void setSecond(B second) { - this.second = second; - } - - @Override - public String toString() { - return "Pair{" + - "first=" + first + - ", second=" + second + - '}'; - } -} diff --git a/Plugin/src/main/resources/config.yml b/Plugin/src/main/resources/config.yml deleted file mode 100644 index 3323d76..0000000 --- a/Plugin/src/main/resources/config.yml +++ /dev/null @@ -1,126 +0,0 @@ -# -# Illusioner -# by Auxilor -# - -name: "Illusioner" # What should the display name of the Illusioner be? - -override: false # Should the illusioner override all "vanilla" illusioners (adds support for /spawn but may cause issues with other custom mob plugins) - -bossbar: - color: BLUE # Choose from: BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW - style: SOLID # Choose from: SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20 - -xp: - # Chosen at random between a minimum and maximum - minimum: 20000 # Xp points, not levels - maximum: 25000 - -max-health: 600 # Hearts is this number divided by 2, eg 600 is 300 hearts -attack-damage: 50 # This isn't an easy boss. Recommend to keep this high -ignore-explosion-damage: true - -attacks: - # All chances are percentages and can include decimals - - shuffle: # Shuffles the items around in your hotbar - enabled: true - chance: 5 - - effects: - # Types can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionEffectType.html - # Duration is in ticks, there are 20 ticks in a second - 1: - type: BLINDNESS - level: 1 - duration: 40 - chance: 20 - 2: - type: CONFUSION - level: 10 - duration: 200 - chance: 10 - 3: - type: SLOW - level: 3 - duration: 60 - chance: 10 - - summons: - # Entity Types can be found here: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html - # Entities are summoned close to the player - 1: - type: VINDICATOR - chance: 10 - 2: - type: EVOKER - chance: 10 - -spawn: - # Configure a 3x1 tall column of blocks to summon an illusioner - # Plan to add support for other shapes in the future - top-block: CARVED_PUMPKIN - middle-block: BEACON - bottom-block: DIAMOND_BLOCK - -drops: - # EXAMPLE DROP - SET YOUR OWN! - '1': - ==: org.bukkit.inventory.ItemStack - v: 2584 - type: NETHERITE_SWORD - meta: - ==: ItemMeta - meta-type: UNSPECIFIC - display-name: ok - enchants: - ARROW_DAMAGE: 1 - -sounds: - # A sound is defined as follows: - # broadcast - Should the whole server hear this or just the player? - # volume - How far away should people be able to hear this? - # pitch - Range is 0.5 to 2, 0.5 is lower pitch and half speed, 2 is higher pitch and double speed - # Add as many sounds as you want - - hit: - # When the player attacks the illusioner - broadcast: false - sound: ENTITY_ILLUSIONER_CAST_SPELL - volume: 1 - pitch: 2 - - summon: - # When an entity is summoned by the illusioner - broadcast: false - sound: ENTITY_EVOKER_PREPARE_ATTACK - volume: 1 - pitch: 2 - - spawn: - 1: - broadcast: true - sound: ENTITY_ILLUSIONER_MIRROR_MOVE - volume: 1000 - pitch: 0.5 - 2: - broadcast: true - sound: ENTITY_WITHER_SPAWN - volume: 1000 - pitch: 2 - death: - 1: - broadcast: true - sound: ENTITY_EVOKER_PREPARE_WOLOLO - volume: 50 - pitch: 0.8 - 2: - broadcast: true - sound: ENTITY_ILLUSIONER_PREPARE_BLINDNESS - volume: 50 - pitch: 1 - 3: - broadcast: true - sound: ENTITY_WITHER_DEATH - volume: 50 - pitch: 2 \ No newline at end of file diff --git a/README.md b/README.md index b61d000..e859783 100644 --- a/README.md +++ b/README.md @@ -1,22 +1,22 @@


- Illusioner logo + EcoEnchants logo

-

Source code for Illusioner, a premium spigot plugin.

+

Source code for EcoEnchants, a premium spigot plugin.

- - spigot + + spigot - - + + - - + + - + @@ -25,13 +25,12 @@

-[![Title](https://i.imgur.com/Ww5C2OS.png)]() -[![Features](https://i.imgur.com/sqYmdNl.png)]() -[![Docs](https://i.imgur.com/DYU1ooZ.png)](https://www.youtube.com/watch?v=AiRDwKc6LYQ) -[![Compatibility](https://i.imgur.com/xn5ua3c.png)]() +[![Title](https://i.imgur.com/hyPlV1m.png)]() +[![Features](https://i.imgur.com/Tqcu1o2.png)]() +[![Docs](https://i.imgur.com/TRDDt5W.png)](https://ecoenchants.willfp.com/enchantments/all-enchantments) +[![Compatibility](https://i.imgur.com/mlAGlKn.png)]() ## License -*Click here to read [the entire license](https://github.com/Auxilor/Illusioner/blob/master/LICENSE.md).* +*Click here to read [the entire license](https://github.com/Auxilor/EcoEnchants/blob/master/LICENSE.md).* -Illusioner is not freeware. In order to use it you must purchase a license on [spigotmc.org](https://spigotmc.org). Distributing compiled versions of the plugin is not permitted. diff --git a/build.gradle b/build.gradle index ac83e5b..21dc093 100644 --- a/build.gradle +++ b/build.gradle @@ -1,55 +1,105 @@ plugins { id 'java-library' + id 'com.github.johnrengelman.shadow' version '5.2.0' id 'maven-publish' id 'java' } +dependencies { + implementation project(":eco-core").getSubprojects() + implementation 'com.willfp:eco:1.0.0' +} + allprojects { apply plugin: 'java' + apply plugin: 'maven-publish' + apply plugin: 'com.github.johnrengelman.shadow' repositories { mavenCentral() jcenter() mavenLocal() - maven { - url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' - } + maven { url 'https://jitpack.io' } + maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } + maven { url 'https://repo.codemc.org/repository/nms/' } + maven { url 'https://repo.codemc.org/repository/maven-public' } + maven { url "https://oss.sonatype.org/content/repositories/snapshots" } + maven { url 'https://oss.sonatype.org/content/groups/public/' } + maven { url 'https://maven.enginehub.org/repo/' } + maven { url 'https://ci.ender.zone/plugin/repository/project/' } + maven { url 'https://ci.ender.zone/plugin/repository/everything/' } + maven { url 'https://repo.md-5.net/content/repositories/snapshots/' } + maven { url 'https://repo.dmulloy2.net/nexus/repository/public/' } + maven { url 'https://papermc.io/repo/repository/maven-public/' } + maven { url 'https://repo.maven.apache.org/maven2/' } + maven { url 'https://repo.dustplanet.de/artifactory/ext-release-local/' } + maven { url 'https://maven.seyfahni.de/repository/snapshots/' } + maven { url 'https://libraries.minecraft.net/' } + maven { url 'https://repo.spongepowered.org/maven/' } + maven { url 'https://org.kitteh.pastegg' } + maven { url 'https://repo.mikeprimm.com/' } + maven { url 'https://maven.sk89q.com/repo/' } + maven { url 'https://github.com/factions-site/repo/raw/public/' } + maven { url 'https://repo.extendedclip.com/content/repositories/placeholderapi/' } + } - maven { - url 'https://jitpack.io' - } + jar { + onlyIf { !sourceSets.main.allSource.files.isEmpty() } + } - maven { - url 'https://repo.md-5.net/content/repositories/snapshots/' - } + dependencies { + compileOnly 'org.jetbrains:annotations:19.0.0' - maven { - url 'https://papermc.io/repo/repository/maven-public/' - } + compileOnly 'org.projectlombok:lombok:1.18.16' + annotationProcessor 'org.projectlombok:lombok:1.18.16' - maven { - url 'https://libraries.minecraft.net/' - } + testCompileOnly 'org.projectlombok:lombok:1.18.16' + testAnnotationProcessor 'org.projectlombok:lombok:1.18.16' } tasks.withType(JavaCompile) { options.deprecation = true options.encoding = 'UTF-8' } - compileJava.options.encoding = 'UTF-8' + processResources { + filesNotMatching(["**/*.png", "**/models/**", "**/textures/**"]) { + expand projectVersion: project.version + } + } + + compileJava.options.encoding = 'UTF-8' compileJava.dependsOn clean } +tasks.withType(Jar) { + destinationDirectory = file("$rootDir/bin/") +} + clean.doLast { file("${rootDir}/bin").deleteDir() } -group = 'com.willfp.illusioner' +shadowJar { + relocate('org.apache.maven', 'com.willfp.ecoenchants.eco.shaded.maven') + relocate('org.bstats', 'com.willfp.ecoenchants.eco.shaded.bstats') + relocate('com.willfp.eco.', 'com.willfp.ecoenchants.eco.') // Dot is to prevent plugin being shaded into itself + archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + ".jar" +} + +jar { + archiveFileName = findProperty("plugin-name") + " v" + findProperty("version") + " " + "unshaded" + ".jar" +} + +group = 'com.willfp' archivesBaseName = project.name -version = project.version +version = findProperty("version") java.sourceCompatibility = JavaVersion.VERSION_1_8 +compileJava.options.encoding = 'UTF-8' + +build.dependsOn shadowJar + publishing { publications { maven(MavenPublication) { diff --git a/config/checkstyle/checkstyle.xml b/config/checkstyle/checkstyle.xml new file mode 100644 index 0000000..1e777ee --- /dev/null +++ b/config/checkstyle/checkstyle.xml @@ -0,0 +1,184 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/config/checkstyle/suppression.xml b/config/checkstyle/suppression.xml new file mode 100644 index 0000000..cb76125 --- /dev/null +++ b/config/checkstyle/suppression.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/eco-core/build.gradle b/eco-core/build.gradle new file mode 100644 index 0000000..effe84e --- /dev/null +++ b/eco-core/build.gradle @@ -0,0 +1,8 @@ +group 'com.willfp' +version rootProject.version + +subprojects { + dependencies { + compileOnly 'com.willfp:eco:1.0.0' + } +} \ No newline at end of file diff --git a/eco-core/core-nms/build.gradle b/eco-core/core-nms/build.gradle new file mode 100644 index 0000000..4aa1efc --- /dev/null +++ b/eco-core/core-nms/build.gradle @@ -0,0 +1,9 @@ +group 'com.willfp' +version rootProject.version + +subprojects { + dependencies { + compileOnly project(':eco-core:core-proxy') + compileOnly project(':eco-core:core-plugin') + } +} \ No newline at end of file diff --git a/eco-core/core-nms/v1_15_R1/build.gradle b/eco-core/core-nms/v1_15_R1/build.gradle new file mode 100644 index 0000000..52cdf75 --- /dev/null +++ b/eco-core/core-nms/v1_15_R1/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot:1.15.2-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/EntityIllusioner.java b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/EntityIllusioner.java similarity index 56% rename from NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/EntityIllusioner.java rename to eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/EntityIllusioner.java index 4afdc22..6d3076b 100644 --- a/NMS/v1_15_R1/src/main/java/com/willfp/illusioner/v1_15_R1/EntityIllusioner.java +++ b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/EntityIllusioner.java @@ -1,23 +1,58 @@ -package com.willfp.illusioner.v1_15_R1; +package com.willfp.illusioner.proxy.v1_15_R1; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import net.minecraft.server.v1_15_R1.*; +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import net.minecraft.server.v1_15_R1.EntityHuman; +import net.minecraft.server.v1_15_R1.EntityIllagerIllusioner; +import net.minecraft.server.v1_15_R1.EntityIllagerWizard; +import net.minecraft.server.v1_15_R1.EntityInsentient; +import net.minecraft.server.v1_15_R1.EntityIronGolem; +import net.minecraft.server.v1_15_R1.EntityRaider; +import net.minecraft.server.v1_15_R1.EntityTypes; +import net.minecraft.server.v1_15_R1.EntityVillagerAbstract; +import net.minecraft.server.v1_15_R1.GenericAttributes; +import net.minecraft.server.v1_15_R1.PathfinderGoalBowShoot; +import net.minecraft.server.v1_15_R1.PathfinderGoalFloat; +import net.minecraft.server.v1_15_R1.PathfinderGoalHurtByTarget; +import net.minecraft.server.v1_15_R1.PathfinderGoalLookAtPlayer; +import net.minecraft.server.v1_15_R1.PathfinderGoalMeleeAttack; +import net.minecraft.server.v1_15_R1.PathfinderGoalNearestAttackableTarget; +import net.minecraft.server.v1_15_R1.PathfinderGoalRandomStroll; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.attribute.Attribute; import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; -@SuppressWarnings("unchecked") -public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerWrapper { +public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerProxy { + /** + * The display name for the illusioner. + */ private final String displayName; - public EntityIllusioner(Location location, double maxHealth, double attackDamage, String name) { + /** + * The boss bar linked to the illusioner. + */ + private BossBar bossBar = null; + + /** + * Instantiate a new illusioner entity. + * + * @param location The location to spawn it at. + * @param maxHealth The max health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + */ + public EntityIllusioner(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle()); this.displayName = name; @@ -45,15 +80,21 @@ public class EntityIllusioner extends EntityIllagerIllusioner implements EntityI } @Override - public BossBar createBossbar(Plugin plugin, BarColor color, BarStyle style) { - BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style); + public BossBar createBossbar(@NotNull final Plugin plugin, + @NotNull final BarColor color, + @NotNull final BarStyle style) { + if (bossBar != null) { + return bossBar; + } + BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style, (BarFlag) null); + this.bossBar = bossBar; Bukkit.getServer().getOnlinePlayers().forEach(bossBar::addPlayer); LivingEntity entity = (LivingEntity) this.getBukkitEntity(); new BukkitRunnable() { @Override public void run() { - if(!entity.isDead()) { + if (!entity.isDead()) { bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); } else { bossBar.getPlayers().forEach(bossBar::removePlayer); diff --git a/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/IllusionerHelper.java b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/IllusionerHelper.java new file mode 100644 index 0000000..e3a42c5 --- /dev/null +++ b/eco-core/core-nms/v1_15_R1/src/main/java/com/willfp/illusioner/proxy/v1_15_R1/IllusionerHelper.java @@ -0,0 +1,38 @@ +package com.willfp.illusioner.proxy.v1_15_R1; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_15_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_15_R1.entity.CraftIllusioner; +import org.bukkit.entity.Illusioner; +import org.jetbrains.annotations.NotNull; + +public class IllusionerHelper implements IllusionerHelperProxy { + @Override + public EntityIllusionerProxy spawn(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); + ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); + return illusioner; + } + + @Override + public EntityIllusionerProxy adapt(@NotNull final Illusioner illusioner, + @NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + if (illusioner instanceof CraftIllusioner) { + if (((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerProxy) { + return null; + } + } else { + return null; + } + illusioner.remove(); + return spawn(location, maxHealth, attackDamage, name); + } +} diff --git a/eco-core/core-nms/v1_16_R1/build.gradle b/eco-core/core-nms/v1_16_R1/build.gradle new file mode 100644 index 0000000..4962362 --- /dev/null +++ b/eco-core/core-nms/v1_16_R1/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot:1.16.1-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/EntityIllusioner.java b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/EntityIllusioner.java similarity index 56% rename from NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/EntityIllusioner.java rename to eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/EntityIllusioner.java index 94bf98d..523e03b 100644 --- a/NMS/v1_16_R1/src/main/java/com/willfp/illusioner/v1_16_R1/EntityIllusioner.java +++ b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/EntityIllusioner.java @@ -1,23 +1,59 @@ -package com.willfp.illusioner.v1_16_R1; +package com.willfp.illusioner.proxy.v1_16_R1; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import net.minecraft.server.v1_16_R1.*; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import net.minecraft.server.v1_16_R1.EntityHuman; +import net.minecraft.server.v1_16_R1.EntityIllagerIllusioner; +import net.minecraft.server.v1_16_R1.EntityIllagerWizard; +import net.minecraft.server.v1_16_R1.EntityInsentient; +import net.minecraft.server.v1_16_R1.EntityIronGolem; +import net.minecraft.server.v1_16_R1.EntityRaider; +import net.minecraft.server.v1_16_R1.EntityTypes; +import net.minecraft.server.v1_16_R1.EntityVillagerAbstract; +import net.minecraft.server.v1_16_R1.GenericAttributes; +import net.minecraft.server.v1_16_R1.PathfinderGoalBowShoot; +import net.minecraft.server.v1_16_R1.PathfinderGoalFloat; +import net.minecraft.server.v1_16_R1.PathfinderGoalHurtByTarget; +import net.minecraft.server.v1_16_R1.PathfinderGoalLookAtPlayer; +import net.minecraft.server.v1_16_R1.PathfinderGoalMeleeAttack; +import net.minecraft.server.v1_16_R1.PathfinderGoalNearestAttackableTarget; +import net.minecraft.server.v1_16_R1.PathfinderGoalRandomStroll; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.attribute.Attribute; import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; import org.bukkit.entity.LivingEntity; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; -@SuppressWarnings("unchecked") -public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerWrapper { +public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerProxy { + /** + * The display name for the illusioner. + */ private final String displayName; - public EntityIllusioner(Location location, double maxHealth, double attackDamage, String name) { + /** + * The boss bar linked to the illusioner. + */ + private BossBar bossBar = null; + + /** + * Instantiate a new illusioner entity. + * + * @param location The location to spawn it at. + * @param maxHealth The max health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + */ + public EntityIllusioner(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle()); this.displayName = name; @@ -45,15 +81,21 @@ public class EntityIllusioner extends EntityIllagerIllusioner implements EntityI } @Override - public BossBar createBossbar(Plugin plugin, BarColor color, BarStyle style) { - BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style); + public BossBar createBossbar(@NotNull final Plugin plugin, + @NotNull final BarColor color, + @NotNull final BarStyle style) { + if (bossBar != null) { + return bossBar; + } + BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style, (BarFlag) null); + this.bossBar = bossBar; Bukkit.getServer().getOnlinePlayers().forEach(bossBar::addPlayer); LivingEntity entity = (LivingEntity) this.getBukkitEntity(); new BukkitRunnable() { @Override public void run() { - if(!entity.isDead()) { + if (!entity.isDead()) { bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); } else { bossBar.getPlayers().forEach(bossBar::removePlayer); diff --git a/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/IllusionerHelper.java b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/IllusionerHelper.java new file mode 100644 index 0000000..acf4f8b --- /dev/null +++ b/eco-core/core-nms/v1_16_R1/src/main/java/com/willfp/illusioner/proxy/v1_16_R1/IllusionerHelper.java @@ -0,0 +1,38 @@ +package com.willfp.illusioner.proxy.v1_16_R1; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R1.entity.CraftIllusioner; +import org.bukkit.entity.Illusioner; +import org.jetbrains.annotations.NotNull; + +public class IllusionerHelper implements IllusionerHelperProxy { + @Override + public EntityIllusionerProxy spawn(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); + ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); + return illusioner; + } + + @Override + public EntityIllusionerProxy adapt(@NotNull final Illusioner illusioner, + @NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + if (illusioner instanceof CraftIllusioner) { + if (((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerProxy) { + return null; + } + } else { + return null; + } + illusioner.remove(); + return spawn(location, maxHealth, attackDamage, name); + } +} diff --git a/eco-core/core-nms/v1_16_R2/build.gradle b/eco-core/core-nms/v1_16_R2/build.gradle new file mode 100644 index 0000000..3f4d50c --- /dev/null +++ b/eco-core/core-nms/v1_16_R2/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot:1.16.3-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/EntityIllusioner.java b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/EntityIllusioner.java similarity index 56% rename from NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/EntityIllusioner.java rename to eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/EntityIllusioner.java index d4f47e3..c44335e 100644 --- a/NMS/v1_16_R2/src/main/java/com/willfp/illusioner/v1_16_R2/EntityIllusioner.java +++ b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/EntityIllusioner.java @@ -1,23 +1,59 @@ -package com.willfp.illusioner.v1_16_R2; +package com.willfp.illusioner.proxy.v1_16_R2; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import net.minecraft.server.v1_16_R2.*; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import net.minecraft.server.v1_16_R2.EntityHuman; +import net.minecraft.server.v1_16_R2.EntityIllagerIllusioner; +import net.minecraft.server.v1_16_R2.EntityIllagerWizard; +import net.minecraft.server.v1_16_R2.EntityInsentient; +import net.minecraft.server.v1_16_R2.EntityIronGolem; +import net.minecraft.server.v1_16_R2.EntityRaider; +import net.minecraft.server.v1_16_R2.EntityTypes; +import net.minecraft.server.v1_16_R2.EntityVillagerAbstract; +import net.minecraft.server.v1_16_R2.GenericAttributes; +import net.minecraft.server.v1_16_R2.PathfinderGoalBowShoot; +import net.minecraft.server.v1_16_R2.PathfinderGoalFloat; +import net.minecraft.server.v1_16_R2.PathfinderGoalHurtByTarget; +import net.minecraft.server.v1_16_R2.PathfinderGoalLookAtPlayer; +import net.minecraft.server.v1_16_R2.PathfinderGoalMeleeAttack; +import net.minecraft.server.v1_16_R2.PathfinderGoalNearestAttackableTarget; +import net.minecraft.server.v1_16_R2.PathfinderGoalRandomStroll; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.attribute.Attribute; import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarFlag; import org.bukkit.boss.BarStyle; import org.bukkit.boss.BossBar; import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; import org.bukkit.entity.LivingEntity; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; -@SuppressWarnings("unchecked") -public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerWrapper { +public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerProxy { + /** + * The display name for the illusioner. + */ private final String displayName; - public EntityIllusioner(Location location, double maxHealth, double attackDamage, String name) { + /** + * The boss bar linked to the illusioner. + */ + private BossBar bossBar = null; + + /** + * Instantiate a new illusioner entity. + * + * @param location The location to spawn it at. + * @param maxHealth The max health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + */ + public EntityIllusioner(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle()); this.displayName = name; @@ -45,15 +81,21 @@ public class EntityIllusioner extends EntityIllagerIllusioner implements EntityI } @Override - public BossBar createBossbar(Plugin plugin, BarColor color, BarStyle style) { - BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style); + public BossBar createBossbar(@NotNull final Plugin plugin, + @NotNull final BarColor color, + @NotNull final BarStyle style) { + if (bossBar != null) { + return bossBar; + } + BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style, (BarFlag) null); + this.bossBar = bossBar; Bukkit.getServer().getOnlinePlayers().forEach(bossBar::addPlayer); LivingEntity entity = (LivingEntity) this.getBukkitEntity(); new BukkitRunnable() { @Override public void run() { - if(!entity.isDead()) { + if (!entity.isDead()) { bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); } else { bossBar.getPlayers().forEach(bossBar::removePlayer); diff --git a/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/IllusionerHelper.java b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/IllusionerHelper.java new file mode 100644 index 0000000..51e6101 --- /dev/null +++ b/eco-core/core-nms/v1_16_R2/src/main/java/com/willfp/illusioner/proxy/v1_16_R2/IllusionerHelper.java @@ -0,0 +1,38 @@ +package com.willfp.illusioner.proxy.v1_16_R2; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R2.entity.CraftIllusioner; +import org.bukkit.entity.Illusioner; +import org.jetbrains.annotations.NotNull; + +public class IllusionerHelper implements IllusionerHelperProxy { + @Override + public EntityIllusionerProxy spawn(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); + ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); + return illusioner; + } + + @Override + public EntityIllusionerProxy adapt(@NotNull final Illusioner illusioner, + @NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + if (illusioner instanceof CraftIllusioner) { + if (((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerProxy) { + return null; + } + } else { + return null; + } + illusioner.remove(); + return spawn(location, maxHealth, attackDamage, name); + } +} diff --git a/eco-core/core-nms/v1_16_R3/build.gradle b/eco-core/core-nms/v1_16_R3/build.gradle new file mode 100644 index 0000000..5930f17 --- /dev/null +++ b/eco-core/core-nms/v1_16_R3/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot:1.16.4-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/EntityIllusioner.java b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/EntityIllusioner.java similarity index 58% rename from NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/EntityIllusioner.java rename to eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/EntityIllusioner.java index 772e89f..0b13ad7 100644 --- a/NMS/v1_16_R3/src/main/java/com/willfp/illusioner/v1_16_R3/EntityIllusioner.java +++ b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/EntityIllusioner.java @@ -1,7 +1,22 @@ -package com.willfp.illusioner.v1_16_R3; +package com.willfp.illusioner.proxy.v1_16_R3; -import com.willfp.illusioner.nms.api.EntityIllusionerWrapper; -import net.minecraft.server.v1_16_R3.*; +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import net.minecraft.server.v1_16_R3.EntityHuman; +import net.minecraft.server.v1_16_R3.EntityIllagerIllusioner; +import net.minecraft.server.v1_16_R3.EntityIllagerWizard; +import net.minecraft.server.v1_16_R3.EntityInsentient; +import net.minecraft.server.v1_16_R3.EntityIronGolem; +import net.minecraft.server.v1_16_R3.EntityRaider; +import net.minecraft.server.v1_16_R3.EntityTypes; +import net.minecraft.server.v1_16_R3.EntityVillagerAbstract; +import net.minecraft.server.v1_16_R3.GenericAttributes; +import net.minecraft.server.v1_16_R3.PathfinderGoalBowShoot; +import net.minecraft.server.v1_16_R3.PathfinderGoalFloat; +import net.minecraft.server.v1_16_R3.PathfinderGoalHurtByTarget; +import net.minecraft.server.v1_16_R3.PathfinderGoalLookAtPlayer; +import net.minecraft.server.v1_16_R3.PathfinderGoalMeleeAttack; +import net.minecraft.server.v1_16_R3.PathfinderGoalNearestAttackableTarget; +import net.minecraft.server.v1_16_R3.PathfinderGoalRandomStroll; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.attribute.Attribute; @@ -13,13 +28,31 @@ import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; import org.bukkit.entity.LivingEntity; import org.bukkit.plugin.Plugin; import org.bukkit.scheduler.BukkitRunnable; +import org.jetbrains.annotations.NotNull; -@SuppressWarnings("unchecked") -public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerWrapper { +public class EntityIllusioner extends EntityIllagerIllusioner implements EntityIllusionerProxy { + /** + * The display name for the illusioner. + */ private final String displayName; + + /** + * The boss bar linked to the illusioner. + */ private BossBar bossBar = null; - public EntityIllusioner(Location location, double maxHealth, double attackDamage, String name) { + /** + * Instantiate a new illusioner entity. + * + * @param location The location to spawn it at. + * @param maxHealth The max health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + */ + public EntityIllusioner(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { super(EntityTypes.ILLUSIONER, ((CraftWorld) location.getWorld()).getHandle()); this.displayName = name; @@ -47,8 +80,12 @@ public class EntityIllusioner extends EntityIllagerIllusioner implements EntityI } @Override - public BossBar createBossbar(Plugin plugin, BarColor color, BarStyle style) { - if(bossBar != null) return bossBar; + public BossBar createBossbar(@NotNull final Plugin plugin, + @NotNull final BarColor color, + @NotNull final BarStyle style) { + if (bossBar != null) { + return bossBar; + } BossBar bossBar = Bukkit.getServer().createBossBar(this.displayName, color, style, (BarFlag) null); this.bossBar = bossBar; Bukkit.getServer().getOnlinePlayers().forEach(bossBar::addPlayer); @@ -57,7 +94,7 @@ public class EntityIllusioner extends EntityIllagerIllusioner implements EntityI new BukkitRunnable() { @Override public void run() { - if(!entity.isDead()) { + if (!entity.isDead()) { bossBar.setProgress(entity.getHealth() / entity.getAttribute(Attribute.GENERIC_MAX_HEALTH).getValue()); } else { bossBar.getPlayers().forEach(bossBar::removePlayer); diff --git a/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/IllusionerHelper.java b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/IllusionerHelper.java new file mode 100644 index 0000000..df3618f --- /dev/null +++ b/eco-core/core-nms/v1_16_R3/src/main/java/com/willfp/illusioner/proxy/v1_16_R3/IllusionerHelper.java @@ -0,0 +1,38 @@ +package com.willfp.illusioner.proxy.v1_16_R3; + +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import org.bukkit.Location; +import org.bukkit.craftbukkit.v1_16_R3.CraftWorld; +import org.bukkit.craftbukkit.v1_16_R3.entity.CraftIllusioner; +import org.bukkit.entity.Illusioner; +import org.jetbrains.annotations.NotNull; + +public class IllusionerHelper implements IllusionerHelperProxy { + @Override + public EntityIllusionerProxy spawn(@NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + EntityIllusioner illusioner = new EntityIllusioner(location, maxHealth, attackDamage, name); + ((CraftWorld) location.getWorld()).getHandle().addEntity(illusioner); + return illusioner; + } + + @Override + public EntityIllusionerProxy adapt(@NotNull final Illusioner illusioner, + @NotNull final Location location, + final double maxHealth, + final double attackDamage, + @NotNull final String name) { + if (illusioner instanceof CraftIllusioner) { + if (((CraftIllusioner) illusioner).getHandle() instanceof EntityIllusionerProxy) { + return null; + } + } else { + return null; + } + illusioner.remove(); + return spawn(location, maxHealth, attackDamage, name); + } +} diff --git a/eco-core/core-plugin/build.gradle b/eco-core/core-plugin/build.gradle new file mode 100644 index 0000000..85b3b5c --- /dev/null +++ b/eco-core/core-plugin/build.gradle @@ -0,0 +1,13 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly project(":eco-core:core-proxy") + compileOnly 'org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT' + compileOnly 'commons-io:commons-io:2.8.0' + compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT' + compileOnly 'net.ess3:EssentialsX:2.18.1' + compileOnly 'com.destroystokyo.paper:paper-api:1.16.3-R0.1-SNAPSHOT' + compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157' + compileOnly 'me.clip:placeholderapi:2.10.9' +} \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java new file mode 100644 index 0000000..0dd8e39 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/IllusionerPlugin.java @@ -0,0 +1,122 @@ +package com.willfp.illusioner; + +import com.willfp.eco.util.command.AbstractCommand; +import com.willfp.eco.util.integrations.IntegrationLoader; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.eco.util.protocollib.AbstractPacketAdapter; +import com.willfp.illusioner.commands.CommandIldebug; +import com.willfp.illusioner.commands.CommandIlreload; +import com.willfp.illusioner.config.IllusionerConfigs; +import com.willfp.illusioner.illusioner.IllusionerManager; +import com.willfp.illusioner.illusioner.listeners.AttackListeners; +import com.willfp.illusioner.illusioner.listeners.DeathListeners; +import com.willfp.illusioner.illusioner.listeners.SpawnListeners; +import org.bukkit.event.Listener; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@SuppressWarnings("unused") +public class IllusionerPlugin extends AbstractEcoPlugin { + /** + * Internal constructor called by bukkit on plugin load. + */ + public IllusionerPlugin() { + super("Illusioner", 86576, 9596, "com.willfp.illusioner.proxy"); + } + + /** + * Code executed on plugin enable. + */ + @Override + public void enable() { + + } + + /** + * Code executed on plugin disable. + */ + @Override + public void disable() { + + } + + /** + * Nothing is called on plugin load. + */ + @Override + public void load() { + // Nothing needs to be called on load + } + + /** + * Code executed on reload. + */ + @Override + public void onReload() { + IllusionerManager.OPTIONS.reload(); + } + + /** + * Code executed after server is up. + */ + @Override + public void postLoad() { + // Nothing is executed post-load. + } + + /** + * EcoEnchants-specific integrations. + * + * @return A list of all integrations. + */ + @Override + public List getIntegrationLoaders() { + return new ArrayList<>(); + } + + /** + * EcoEnchants-specific commands. + * + * @return A list of all commands. + */ + @Override + public List getCommands() { + return Arrays.asList( + new CommandIldebug(this), + new CommandIlreload(this) + ); + } + + /** + * Packet Adapters for enchant display. + * + * @return A list of packet adapters. + */ + @Override + public List getPacketAdapters() { + return new ArrayList<>(); + } + + /** + * EcoEnchants-specific listeners. + * + * @return A list of all listeners. + */ + @Override + public List getListeners() { + return Arrays.asList( + new AttackListeners(), + new DeathListeners(), + new SpawnListeners(this) + ); + } + + @Override + public List> getUpdatableClasses() { + return Arrays.asList( + IllusionerConfigs.class + ); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java new file mode 100644 index 0000000..60fbd2d --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIldebug.java @@ -0,0 +1,46 @@ +package com.willfp.illusioner.commands; + +import com.willfp.eco.util.command.AbstractCommand; +import com.willfp.illusioner.IllusionerPlugin; +import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class CommandIldebug extends AbstractCommand { + /** + * Instantiate a new executor for /ildebug. + * + * @param plugin The plugin to manage the execution for. + */ + public CommandIldebug(@NotNull final IllusionerPlugin plugin) { + super(plugin, "ildebug", "illusioner.debug", false); + } + + @Override + public void onExecute(@NotNull final CommandSender sender, + @NotNull final List args) { + this.getPlugin().getLog().info("--------------- BEGIN DEBUG ----------------"); + if (sender instanceof Player) { + Player player = (Player) sender; + player.sendMessage("Held Item: " + player.getInventory().getItemInMainHand().toString()); + this.getPlugin().getLog().info(""); + + this.getPlugin().getLog().info("Held Item: " + player.getInventory().getItemInMainHand().toString()); + this.getPlugin().getLog().info(""); + } + + + this.getPlugin().getLog().info("Running Version: " + IllusionerPlugin.getInstance().getDescription().getVersion()); + this.getPlugin().getLog().info(""); + + this.getPlugin().getLog().info("Server Information: "); + this.getPlugin().getLog().info("Players Online: " + Bukkit.getServer().getOnlinePlayers().size()); + this.getPlugin().getLog().info("Bukkit IP: " + Bukkit.getIp()); + this.getPlugin().getLog().info("Running Version: " + Bukkit.getVersion() + ", Bukkit Version: " + Bukkit.getBukkitVersion() + ", Alt Version: " + Bukkit.getServer().getVersion()); + this.getPlugin().getLog().info("Motd: " + Bukkit.getServer().getMotd()); + this.getPlugin().getLog().info("--------------- END DEBUG ----------------"); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java new file mode 100644 index 0000000..ec94a04 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/commands/CommandIlreload.java @@ -0,0 +1,27 @@ +package com.willfp.illusioner.commands; + +import com.willfp.eco.util.command.AbstractCommand; +import com.willfp.eco.util.config.Configs; +import com.willfp.illusioner.IllusionerPlugin; +import org.bukkit.command.CommandSender; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class CommandIlreload extends AbstractCommand { + /** + * Instantiate a new executor for /ilreload. + * + * @param plugin The plugin to manage the execution for. + */ + public CommandIlreload(@NotNull final IllusionerPlugin plugin) { + super(plugin, "ilreload", "illusioner.reload", false); + } + + @Override + public void onExecute(@NotNull final CommandSender sender, + @NotNull final List args) { + this.getPlugin().reload(); + sender.sendMessage(Configs.LANG.getMessage("reloaded")); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/IllusionerConfigs.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/IllusionerConfigs.java new file mode 100644 index 0000000..b41243f --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/IllusionerConfigs.java @@ -0,0 +1,35 @@ +package com.willfp.illusioner.config; + +import com.willfp.eco.util.config.updating.annotations.ConfigUpdater; +import com.willfp.illusioner.config.configs.Attacks; +import com.willfp.illusioner.config.configs.Drops; +import com.willfp.illusioner.config.configs.Sounds; +import lombok.experimental.UtilityClass; + +@UtilityClass +public class IllusionerConfigs { + /** + * drops.yml. + */ + public static final Drops DROPS = new Drops(); + + /** + * sounds.yml. + */ + public static final Sounds SOUNDS = new Sounds(); + + /** + * attacks.yml. + */ + public static final Attacks ATTACKS = new Attacks(); + + /** + * Update all configs. + */ + @ConfigUpdater + public void updateConfigs() { + DROPS.update(); + SOUNDS.update(); + ATTACKS.update(); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java new file mode 100644 index 0000000..c8f49c0 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Attacks.java @@ -0,0 +1,12 @@ +package com.willfp.illusioner.config.configs; + +import com.willfp.eco.util.config.BaseConfig; + +public class Attacks extends BaseConfig { + /** + * Instantiate attacks.yml. + */ + public Attacks() { + super("attacks", false); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java new file mode 100644 index 0000000..5a91888 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Drops.java @@ -0,0 +1,12 @@ +package com.willfp.illusioner.config.configs; + +import com.willfp.eco.util.config.BaseConfig; + +public class Drops extends BaseConfig { + /** + * Instantiate drops.yml. + */ + public Drops() { + super("drops", false); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java new file mode 100644 index 0000000..4eb2ae4 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/config/configs/Sounds.java @@ -0,0 +1,12 @@ +package com.willfp.illusioner.config.configs; + +import com.willfp.eco.util.config.BaseConfig; + +public class Sounds extends BaseConfig { + /** + * Instantiate sounds.yml. + */ + public Sounds() { + super("sounds", false); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java new file mode 100644 index 0000000..93281bd --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/BlockStructure.java @@ -0,0 +1,52 @@ +package com.willfp.illusioner.illusioner; + +import lombok.Getter; +import org.bukkit.Material; +import org.jetbrains.annotations.NotNull; + +public class BlockStructure { + /** + * The bottom block. + */ + @Getter + private final Material bottom; + + /** + * The middle block. + */ + @Getter + private final Material middle; + + /** + * The top block. + */ + @Getter + private final Material top; + + /** + * Create a new block structure. + * + * @param bottom The bottom block. + * @param middle The middle block. + * @param top The top block. + */ + public BlockStructure(@NotNull final Material bottom, + @NotNull final Material middle, + @NotNull final Material top) { + this.bottom = bottom; + this.middle = middle; + this.top = top; + } + + /** + * If a block structure matches the specified structure in illusioner options. + * + * @param structure The block structure to test against. + * @return If the structures match. + */ + public static boolean matches(@NotNull final BlockStructure structure) { + return structure.getBottom().equals(IllusionerManager.OPTIONS.getSpawnStructure().getBottom()) + && structure.getMiddle().equals(IllusionerManager.OPTIONS.getSpawnStructure().getMiddle()) + && structure.getTop().equals(IllusionerManager.OPTIONS.getSpawnStructure().getTop()); + } +} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java similarity index 78% rename from Plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java rename to eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java index 027d3f9..382c25f 100644 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/IllusionerManager.java @@ -3,5 +3,8 @@ package com.willfp.illusioner.illusioner; import com.willfp.illusioner.illusioner.options.IllusionerOptions; public class IllusionerManager { + /** + * The options related to the illusioner. + */ public static final IllusionerOptions OPTIONS = new IllusionerOptions(); } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/OptionedSound.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/OptionedSound.java new file mode 100644 index 0000000..60ee02c --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/OptionedSound.java @@ -0,0 +1,49 @@ +package com.willfp.illusioner.illusioner; + +import lombok.Getter; +import org.bukkit.Sound; +import org.jetbrains.annotations.NotNull; + +public class OptionedSound { + /** + * The sound. + */ + @Getter + private final Sound sound; + + /** + * The volume. + */ + @Getter + private final float volume; + + /** + * The pitch, from 0.5 to 2. + */ + @Getter + private final float pitch; + + /** + * If the sound should be played to the whole server. + */ + @Getter + private final boolean broadcast; + + /** + * Create a new optioned sound. + * + * @param sound The sound. + * @param volume The volume. + * @param pitch The pitch, from 0.5 to 2. + * @param broadcast If the sound should be played to the whole server. + */ + public OptionedSound(@NotNull final Sound sound, + final float volume, + final float pitch, + final boolean broadcast) { + this.sound = sound; + this.volume = volume; + this.pitch = pitch; + this.broadcast = broadcast; + } +} diff --git a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java similarity index 61% rename from Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java rename to eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java index 7857919..fa24301 100644 --- a/Plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/AttackListeners.java @@ -1,8 +1,8 @@ package com.willfp.illusioner.illusioner.listeners; +import com.willfp.eco.util.NumberUtils; import com.willfp.illusioner.illusioner.IllusionerManager; -import com.willfp.illusioner.util.NumberUtils; -import com.willfp.illusioner.util.internal.OptionedSound; +import com.willfp.illusioner.illusioner.OptionedSound; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.Sound; @@ -15,55 +15,64 @@ import org.bukkit.event.entity.EntityDamageByEntityEvent; import org.bukkit.event.entity.EntityDamageEvent; import org.bukkit.inventory.ItemStack; import org.bukkit.potion.PotionEffect; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.Collections; import java.util.List; public class AttackListeners implements Listener { + /** + * Called when a player attacks an illusioner. + * + * @param event The event to listen for. + */ @EventHandler(ignoreCancelled = true) - public void onIllusionerAttack(EntityDamageByEntityEvent event) { - if(!event.getDamager().getType().equals(EntityType.ILLUSIONER)) + public void onIllusionerAttack(@NotNull final EntityDamageByEntityEvent event) { + if (!event.getDamager().getType().equals(EntityType.ILLUSIONER)) { return; + } Player temp = null; - if(event.getEntity() instanceof Player) { + if (event.getEntity() instanceof Player) { temp = (Player) event.getEntity(); - } else if(event.getEntity() instanceof Projectile) { - if(((Projectile) event.getEntity()).getShooter() instanceof Player) { + } else if (event.getEntity() instanceof Projectile) { + if (((Projectile) event.getEntity()).getShooter() instanceof Player) { temp = (Player) ((Projectile) event.getEntity()).getShooter(); } } - if(temp == null) + if (temp == null) { return; + } Player player = temp; OptionedSound hitSound = IllusionerManager.OPTIONS.getGameplayOptions().getHitSound(); - if(hitSound.isBroadcast()) { + if (hitSound.isBroadcast()) { player.getWorld().playSound(event.getEntity().getLocation(), hitSound.getSound(), hitSound.getVolume(), hitSound.getPitch()); } else { player.playSound(event.getEntity().getLocation(), hitSound.getSound(), hitSound.getVolume(), hitSound.getPitch()); } IllusionerManager.OPTIONS.getGameplayOptions().getEffectOptions().forEach(effectOption -> { - if(NumberUtils.randFloat(0, 100) > effectOption.getChance()) + if (NumberUtils.randFloat(0, 100) > effectOption.getChance()) { return; + } player.addPotionEffect(new PotionEffect(effectOption.getEffectType(), effectOption.getDuration(), effectOption.getLevel() - 1)); }); - if(IllusionerManager.OPTIONS.getGameplayOptions().isShuffle()) { - if(NumberUtils.randFloat(0, 100) < IllusionerManager.OPTIONS.getGameplayOptions().getShuffleChance()) { + if (IllusionerManager.OPTIONS.getGameplayOptions().isShuffle()) { + if (NumberUtils.randFloat(0, 100) < IllusionerManager.OPTIONS.getGameplayOptions().getShuffleChance()) { List hotbar = new ArrayList<>(); - for(int i = 0; i<9; i++) { + for (int i = 0; i < 9; i++) { hotbar.add(player.getInventory().getItem(i)); } Collections.shuffle(hotbar); int i2 = 0; - for(ItemStack item : hotbar) { + for (ItemStack item : hotbar) { player.getInventory().setItem(i2, item); i2++; } @@ -72,17 +81,18 @@ public class AttackListeners implements Listener { } IllusionerManager.OPTIONS.getGameplayOptions().getSummonerOptions().forEach(summonerOption -> { - if(NumberUtils.randFloat(0, 100) > summonerOption.getChance()) + if (NumberUtils.randFloat(0, 100) > summonerOption.getChance()) { return; + } - Location loc = player.getLocation().add(NumberUtils.randInt(2,6), 0, NumberUtils.randInt(2,6)); - while(!loc.getBlock().getType().equals(Material.AIR)) { + Location loc = player.getLocation().add(NumberUtils.randInt(2, 6), 0, NumberUtils.randInt(2, 6)); + while (!loc.getBlock().getType().equals(Material.AIR)) { loc.add(0, 1, 0); } player.getWorld().spawnEntity(loc, summonerOption.getType()); OptionedSound summonSound = IllusionerManager.OPTIONS.getGameplayOptions().getSummonSound(); - if(summonSound.isBroadcast()) { + if (summonSound.isBroadcast()) { player.getWorld().playSound(event.getEntity().getLocation(), summonSound.getSound(), summonSound.getVolume(), summonSound.getPitch()); } else { player.playSound(event.getEntity().getLocation(), summonSound.getSound(), summonSound.getVolume(), summonSound.getPitch()); @@ -90,14 +100,21 @@ public class AttackListeners implements Listener { }); } + /** + * Called when the illusioner is damaged. + * + * @param event The event to listen for. + */ @EventHandler(ignoreCancelled = true) - public void onIllusionerDamage(EntityDamageEvent event) { - if(!event.getEntity().getType().equals(EntityType.ILLUSIONER)) + public void onIllusionerDamage(@NotNull final EntityDamageEvent event) { + if (!event.getEntity().getType().equals(EntityType.ILLUSIONER)) { return; + } - if(IllusionerManager.OPTIONS.getGameplayOptions().isIgnoreExplosionDamage()) { - if(event.getCause().equals(EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) + if (IllusionerManager.OPTIONS.getGameplayOptions().isIgnoreExplosionDamage()) { + if (event.getCause().equals(EntityDamageEvent.DamageCause.BLOCK_EXPLOSION) || event.getCause().equals(EntityDamageEvent.DamageCause.ENTITY_EXPLOSION)) { event.setCancelled(true); + } } } } diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java new file mode 100644 index 0000000..d1dc713 --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/DeathListeners.java @@ -0,0 +1,46 @@ +package com.willfp.illusioner.illusioner.listeners; + + +import com.willfp.eco.util.drops.DropQueue; +import com.willfp.eco.util.events.entitydeathbyentity.EntityDeathByEntityEvent; +import com.willfp.illusioner.illusioner.IllusionerManager; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +public class DeathListeners implements Listener { + /** + * Called when the illusioner dies. + * + * @param event The event to listen for. + */ + @EventHandler + public void onIllusionerDeath(@NotNull final EntityDeathByEntityEvent event) { + if (!event.getDeathEvent().getEntityType().equals(EntityType.ILLUSIONER)) { + return; + } + + IllusionerManager.OPTIONS.getDeathSounds().forEach(optionedSound -> { + if (optionedSound.isBroadcast()) { + event.getKiller().getWorld().playSound(event.getVictim().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); + } else { + if (event.getKiller() instanceof Player) { + ((Player) event.getKiller()).playSound(event.getVictim().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); + } + } + }); + + if (event.getKiller() instanceof Player) { + new DropQueue((Player) event.getKiller()) + .addItems(IllusionerManager.OPTIONS.getDrops()) + .addXP(IllusionerManager.OPTIONS.generateXp()) + .setLocation(event.getVictim().getLocation()) + .push(); + } + + + event.getDeathEvent().setDroppedExp(0); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java new file mode 100644 index 0000000..6e7724a --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/listeners/SpawnListeners.java @@ -0,0 +1,121 @@ +package com.willfp.illusioner.illusioner.listeners; + +import com.willfp.eco.util.ProxyUtils; +import com.willfp.eco.util.internal.PluginDependent; +import com.willfp.eco.util.plugin.AbstractEcoPlugin; +import com.willfp.illusioner.illusioner.BlockStructure; +import com.willfp.illusioner.illusioner.IllusionerManager; +import com.willfp.illusioner.proxy.proxies.EntityIllusionerProxy; +import com.willfp.illusioner.proxy.proxies.IllusionerHelperProxy; +import org.bukkit.Material; +import org.bukkit.block.Block; +import org.bukkit.entity.Illusioner; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.block.BlockPlaceEvent; +import org.bukkit.event.entity.EntitySpawnEvent; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +public class SpawnListeners extends PluginDependent implements Listener { + /** + * Create new spawn listeners and link them to a plugin. + * + * @param plugin The plugin to link to. + */ + public SpawnListeners(@NotNull final AbstractEcoPlugin plugin) { + super(plugin); + } + + /** + * Called on block place. + * + * @param event The event to listen for. + */ + @EventHandler + public void onSpawn(@NotNull final BlockPlaceEvent event) { + boolean matches = false; + Set match = new HashSet<>(); + for (int i = 0; i < 3; i++) { + Block block1; + Block block2; + Block block3; + + if (i == 0) { + block3 = event.getBlock(); + block2 = event.getBlock().getRelative(0, -1, 0); + block1 = event.getBlock().getRelative(0, -2, 0); + } else if (i == 1) { + block1 = event.getBlock(); + block2 = event.getBlock().getRelative(0, 1, 0); + block3 = event.getBlock().getRelative(0, 2, 0); + } else { + block2 = event.getBlock(); + block1 = event.getBlock().getRelative(0, -1, 0); + block3 = event.getBlock().getRelative(0, 1, 0); + } + + matches = BlockStructure.matches(new BlockStructure(block1.getType(), block2.getType(), block3.getType())); + if (matches) { + match.add(block1); + match.add(block2); + match.add(block3); + break; + } + } + + if (!matches) { + return; + } + + match.forEach(block -> block.setType(Material.AIR)); + IllusionerManager.OPTIONS.getSpawnSounds().forEach(optionedSound -> { + if (optionedSound.isBroadcast()) { + event.getBlock().getWorld().playSound(event.getBlock().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); + } else { + event.getPlayer().playSound(event.getBlock().getLocation(), optionedSound.getSound(), optionedSound.getVolume(), optionedSound.getPitch()); + } + }); + + EntityIllusionerProxy illusioner = ProxyUtils.getProxy(IllusionerHelperProxy.class).spawn( + event.getBlock().getLocation(), + IllusionerManager.OPTIONS.getMaxHealth(), + IllusionerManager.OPTIONS.getAttackDamage(), + IllusionerManager.OPTIONS.getName() + ); + illusioner.createBossbar(this.getPlugin(), IllusionerManager.OPTIONS.getColor(), IllusionerManager.OPTIONS.getStyle()); + } + + /** + * Called on vanilla illusioner spawn. + * + * @param event The event to listen for. + */ + @EventHandler + public void onExternalSpawn(@NotNull final EntitySpawnEvent event) { + if (!(event.getEntity() instanceof Illusioner)) { + return; + } + + if (!IllusionerManager.OPTIONS.isOverride()) { + return; + } + + Illusioner illusioner = (Illusioner) event.getEntity(); + + EntityIllusionerProxy internalIllusioner = ProxyUtils.getProxy(IllusionerHelperProxy.class).adapt( + illusioner, + illusioner.getLocation(), + IllusionerManager.OPTIONS.getMaxHealth(), + IllusionerManager.OPTIONS.getAttackDamage(), + IllusionerManager.OPTIONS.getName() + ); + + if (internalIllusioner == null) { + return; + } + internalIllusioner.createBossbar(this.getPlugin(), IllusionerManager.OPTIONS.getColor(), IllusionerManager.OPTIONS.getStyle()); + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java new file mode 100644 index 0000000..e1b933c --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/GameplayOptions.java @@ -0,0 +1,166 @@ +package com.willfp.illusioner.illusioner.options; + +import com.willfp.eco.util.config.Configs; +import com.willfp.illusioner.config.IllusionerConfigs; +import com.willfp.illusioner.illusioner.OptionedSound; +import lombok.Getter; +import org.bukkit.Sound; +import org.bukkit.entity.EntityType; +import org.bukkit.potion.PotionEffectType; +import org.jetbrains.annotations.NotNull; + +import java.util.HashSet; +import java.util.Set; + +public class GameplayOptions { + /** + * The sound played when the illusioner takes damage. + */ + @Getter + private OptionedSound hitSound; + + /** + * The sound played when the illusioner spawns. + */ + @Getter + private OptionedSound summonSound; + + /** + * The potion effect options. + */ + @Getter + private final Set effectOptions = new HashSet<>(); + + /** + * The mob summon options. + */ + @Getter + private final Set summonerOptions = new HashSet<>(); + + /** + * If the illusioner should shuffle hotbars. + */ + @Getter + private boolean shuffle; + + /** + * The chance of the illusioner shuffling a hotbar. + */ + @Getter + private double shuffleChance; + + /** + * If the illusioner is immune to explosion damage. + */ + @Getter + private boolean ignoreExplosionDamage; + + /** + * Reload the options. + */ + public void reload() { + hitSound = new OptionedSound( + Sound.valueOf(IllusionerConfigs.SOUNDS.getString("hit.sound")), + (float) IllusionerConfigs.SOUNDS.getDouble("hit.volume"), + (float) IllusionerConfigs.SOUNDS.getDouble("hit.pitch"), + IllusionerConfigs.SOUNDS.getBool("hit.broadcast") + ); + + summonSound = new OptionedSound( + Sound.valueOf(IllusionerConfigs.SOUNDS.getString("summon.sound")), + (float) IllusionerConfigs.SOUNDS.getDouble("summon.volume"), + (float) IllusionerConfigs.SOUNDS.getDouble("summon.pitch"), + IllusionerConfigs.SOUNDS.getBool("summon.broadcast") + ); + + shuffle = IllusionerConfigs.ATTACKS.getBool("shuffle.enabled"); + shuffleChance = IllusionerConfigs.ATTACKS.getDouble("shuffle.chance"); + ignoreExplosionDamage = Configs.CONFIG.getBool("ignore-explosion-damage"); + + effectOptions.clear(); + IllusionerConfigs.ATTACKS.getConfig().getConfigurationSection("effects").getKeys(false).forEach(key -> { + PotionEffectType type = PotionEffectType.getByName(IllusionerConfigs.ATTACKS.getString("effects." + key + ".type")); + int level = IllusionerConfigs.ATTACKS.getInt("effects." + key + ".level"); + int duration = IllusionerConfigs.ATTACKS.getInt("effects." + key + ".duration"); + double chance = IllusionerConfigs.ATTACKS.getDouble("effects." + key + ".chance"); + effectOptions.add(new EffectOption(chance, level, duration, type)); + }); + + summonerOptions.clear(); + IllusionerConfigs.ATTACKS.getConfig().getConfigurationSection("summons").getKeys(false).forEach(key -> { + EntityType type = EntityType.valueOf(IllusionerConfigs.ATTACKS.getString("summons." + key + ".type")); + double chance = IllusionerConfigs.ATTACKS.getDouble("summons." + key + ".chance"); + summonerOptions.add(new SummonerOption(chance, type)); + }); + } + + public static class EffectOption { + /** + * The chance of the effect being applied. + */ + @Getter + private final double chance; + + /** + * The level of the effect. + */ + @Getter + private final int level; + + /** + * The potion effect type. + */ + @Getter + private final PotionEffectType effectType; + + /** + * The duration, in ticks. + */ + @Getter + private final int duration; + + /** + * Create a new effect option. + * + * @param chance The chance. + * @param level The level. + * @param duration The duration in ticks. + * @param effectType The effect. + */ + public EffectOption(final double chance, + final int level, + final int duration, + @NotNull final PotionEffectType effectType) { + this.chance = chance; + this.level = level; + this.effectType = effectType; + this.duration = duration; + } + } + + public static class SummonerOption { + /** + * The chance of a mob being spawned. + */ + @Getter + private final double chance; + + /** + * The type of entity to summon. + */ + @Getter + private final EntityType type; + + /** + * Create a new summoner option. + * + * @param chance The chance. + * @param type The entity type. + */ + public SummonerOption(final double chance, + @NotNull final EntityType type) { + this.chance = chance; + this.type = type; + } + } +} diff --git a/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java new file mode 100644 index 0000000..74acc6b --- /dev/null +++ b/eco-core/core-plugin/src/main/java/com/willfp/illusioner/illusioner/options/IllusionerOptions.java @@ -0,0 +1,151 @@ +package com.willfp.illusioner.illusioner.options; + +import com.willfp.eco.util.NumberUtils; +import com.willfp.eco.util.config.Configs; +import com.willfp.eco.util.tuplets.Pair; +import com.willfp.illusioner.config.IllusionerConfigs; +import com.willfp.illusioner.illusioner.BlockStructure; +import com.willfp.illusioner.illusioner.OptionedSound; +import lombok.Getter; +import org.bukkit.Material; +import org.bukkit.Sound; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.inventory.ItemStack; + +import java.util.HashSet; +import java.util.Set; + +public class IllusionerOptions { + /** + * The boss bar color. + */ + @Getter + private BarColor color; + + /** + * The boss bar style. + */ + @Getter + private BarStyle style; + + /** + * The name of the illusioner. + */ + @Getter + private String name; + + /** + * The spawn sounds. + */ + @Getter + private Set spawnSounds; + + /** + * The death sounds. + */ + @Getter + private Set deathSounds; + + /** + * The xp bounds. + */ + private Pair xpBounds; + + /** + * The spawn block structure. + */ + @Getter + private BlockStructure spawnStructure; + + /** + * The max health. + */ + @Getter + private double maxHealth; + + /** + * The attack damage. + */ + @Getter + private double attackDamage; + + /** + * The drops. + */ + @Getter + private Set drops; + + /** + * The gameplay options. + */ + @Getter + private final GameplayOptions gameplayOptions = new GameplayOptions(); + + /** + * If plugin-based illusioners should override vanilla illusioners. + */ + @Getter + private boolean override; + + /** + * Create new illusioner options. + */ + public IllusionerOptions() { + reload(); + } + + /** + * Reload options from config. + */ + public void reload() { + color = BarColor.valueOf(Configs.CONFIG.getString("bossbar.color")); + style = BarStyle.valueOf(Configs.CONFIG.getString("bossbar.style")); + name = Configs.CONFIG.getString("name"); + xpBounds = new Pair<>(Configs.CONFIG.getInt("xp.minimum"), Configs.CONFIG.getInt("xp.maximum")); + maxHealth = Configs.CONFIG.getDouble("max-health"); + attackDamage = Configs.CONFIG.getDouble("attack-damage"); + override = Configs.CONFIG.getBool("override"); + + spawnSounds = new HashSet<>(); + IllusionerConfigs.SOUNDS.getConfig().getConfigurationSection("spawn").getKeys(false).forEach(key -> { + Sound sound = Sound.valueOf(Configs.CONFIG.getString("spawn." + key + ".sound")); + boolean broadcast = Configs.CONFIG.getBool("spawn." + key + ".broadcast"); + float volume = (float) Configs.CONFIG.getDouble("spawn." + key + ".volume"); + float pitch = (float) Configs.CONFIG.getDouble("spawn." + key + ".pitch"); + spawnSounds.add(new OptionedSound(sound, volume, pitch, broadcast)); + }); + + deathSounds = new HashSet<>(); + IllusionerConfigs.SOUNDS.getConfig().getConfigurationSection("death").getKeys(false).forEach(key -> { + Sound sound = Sound.valueOf(Configs.CONFIG.getString("death." + key + ".sound")); + boolean broadcast = Configs.CONFIG.getBool("death." + key + ".broadcast"); + float volume = (float) Configs.CONFIG.getDouble("death." + key + ".volume"); + float pitch = (float) Configs.CONFIG.getDouble("death." + key + ".pitch"); + deathSounds.add(new OptionedSound(sound, volume, pitch, broadcast)); + }); + + spawnStructure = new BlockStructure( + Material.valueOf(Configs.CONFIG.getString("spawn.bottom-block")), + Material.valueOf(Configs.CONFIG.getString("spawn.middle-block")), + Material.valueOf(Configs.CONFIG.getString("spawn.top-block")) + ); + + gameplayOptions.reload(); + + drops = new HashSet<>(); + IllusionerConfigs.DROPS.getConfig().getKeys(false).forEach(key -> { + ItemStack itemStack = Configs.CONFIG.getConfig().getItemStack(key); + drops.add(itemStack); + }); + } + + /** + * Generate xp to drop. + * + * @return The amount of xp to drop. + */ + public int generateXp() { + return NumberUtils.randInt(xpBounds.getFirst(), xpBounds.getSecond()); + } +} diff --git a/eco-core/core-plugin/src/main/resources/attacks.yml b/eco-core/core-plugin/src/main/resources/attacks.yml new file mode 100644 index 0000000..7624bd8 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/attacks.yml @@ -0,0 +1,34 @@ +# All chances are percentages and can include decimals + +shuffle: # Shuffles the items around in your hotbar + enabled: true + chance: 5 + +effects: + # Types can be found here: https://hub.spigotmc.org/javadocs/bukkit/org/bukkit/potion/PotionEffectType.html + # Duration is in ticks, there are 20 ticks in a second + 1: + type: BLINDNESS + level: 1 + duration: 40 + chance: 20 + 2: + type: CONFUSION + level: 10 + duration: 200 + chance: 10 + 3: + type: SLOW + level: 3 + duration: 60 + chance: 10 + +summons: + # Entity Types can be found here: https://hub.spigotmc.org/javadocs/spigot/org/bukkit/entity/EntityType.html + # Entities are summoned close to the player + 1: + type: VINDICATOR + chance: 10 + 2: + type: EVOKER + chance: 10 \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/resources/config.yml b/eco-core/core-plugin/src/main/resources/config.yml new file mode 100644 index 0000000..01ed1b1 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/config.yml @@ -0,0 +1,28 @@ +# +# Illusioner +# by Auxilor +# + +name: "Illusioner" # What should the display name of the Illusioner be? + +override: false # Should the illusioner override all "vanilla" illusioners (adds support for /spawn but may cause issues with other custom mob plugins) + +bossbar: + color: BLUE # Choose from: BLUE, GREEN, PINK, PURPLE, RED, WHITE, YELLOW + style: SOLID # Choose from: SOLID, SEGMENTED_6, SEGMENTED_10, SEGMENTED_12, SEGMENTED_20 + +xp: + # Chosen at random between a minimum and maximum + minimum: 20000 # Xp points, not levels + maximum: 25000 + +max-health: 600 # Hearts is this number divided by 2, eg 600 is 300 hearts +attack-damage: 50 # This isn't an easy boss. Recommend to keep this high +ignore-explosion-damage: true + +spawn: + # Configure a 3x1 tall column of blocks to summon an illusioner + # Plan to add support for other shapes in the future + top-block: CARVED_PUMPKIN + middle-block: BEACON + bottom-block: DIAMOND_BLOCK \ No newline at end of file diff --git a/eco-core/core-plugin/src/main/resources/drops.yml b/eco-core/core-plugin/src/main/resources/drops.yml new file mode 100644 index 0000000..54b0ff8 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/drops.yml @@ -0,0 +1,22 @@ +# EXAMPLE DROP - SET YOUR OWN! +'1': + ==: org.bukkit.inventory.ItemStack + v: 2584 + type: NETHERITE_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: ok + enchants: + ARROW_DAMAGE: 1 +# Example second drop +'2': + ==: org.bukkit.inventory.ItemStack + v: 2584 + type: DIAMOND_SWORD + meta: + ==: ItemMeta + meta-type: UNSPECIFIC + display-name: ok + enchants: + ARROW_DAMAGE: 1 \ No newline at end of file diff --git a/Plugin/src/main/resources/lang.yml b/eco-core/core-plugin/src/main/resources/lang.yml similarity index 100% rename from Plugin/src/main/resources/lang.yml rename to eco-core/core-plugin/src/main/resources/lang.yml diff --git a/Plugin/src/main/resources/plugin.yml b/eco-core/core-plugin/src/main/resources/plugin.yml similarity index 100% rename from Plugin/src/main/resources/plugin.yml rename to eco-core/core-plugin/src/main/resources/plugin.yml diff --git a/eco-core/core-plugin/src/main/resources/sounds.yml b/eco-core/core-plugin/src/main/resources/sounds.yml new file mode 100644 index 0000000..9197a07 --- /dev/null +++ b/eco-core/core-plugin/src/main/resources/sounds.yml @@ -0,0 +1,47 @@ +# A sound is defined as follows: +# broadcast - Should the whole server hear this or just the player? +# volume - How far away should people be able to hear this? +# pitch - Range is 0.5 to 2, 0.5 is lower pitch and half speed, 2 is higher pitch and double speed +# Add as many sounds as you want + +hit: + # When the player attacks the illusioner + broadcast: false + sound: ENTITY_ILLUSIONER_CAST_SPELL + volume: 1 + pitch: 2 + +summon: + # When an entity is summoned by the illusioner + broadcast: false + sound: ENTITY_EVOKER_PREPARE_ATTACK + volume: 1 + pitch: 2 + +spawn: + 1: + broadcast: true + sound: ENTITY_ILLUSIONER_MIRROR_MOVE + volume: 1000 + pitch: 0.5 + 2: + broadcast: true + sound: ENTITY_WITHER_SPAWN + volume: 1000 + pitch: 2 +death: + 1: + broadcast: true + sound: ENTITY_EVOKER_PREPARE_WOLOLO + volume: 50 + pitch: 0.8 + 2: + broadcast: true + sound: ENTITY_ILLUSIONER_PREPARE_BLINDNESS + volume: 50 + pitch: 1 + 3: + broadcast: true + sound: ENTITY_WITHER_DEATH + volume: 50 + pitch: 2 \ No newline at end of file diff --git a/eco-core/core-proxy/build.gradle b/eco-core/core-proxy/build.gradle new file mode 100644 index 0000000..3f90b63 --- /dev/null +++ b/eco-core/core-proxy/build.gradle @@ -0,0 +1,6 @@ +group 'com.willfp' +version rootProject.version + +dependencies { + compileOnly 'org.spigotmc:spigot-api:1.16.4-R0.1-SNAPSHOT' +} \ No newline at end of file diff --git a/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/EntityIllusionerProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/EntityIllusionerProxy.java new file mode 100644 index 0000000..45c264e --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/EntityIllusionerProxy.java @@ -0,0 +1,22 @@ +package com.willfp.illusioner.proxy.proxies; + +import com.willfp.eco.util.proxy.AbstractProxy; +import org.bukkit.boss.BarColor; +import org.bukkit.boss.BarStyle; +import org.bukkit.boss.BossBar; +import org.bukkit.plugin.Plugin; +import org.jetbrains.annotations.NotNull; + +public interface EntityIllusionerProxy extends AbstractProxy { + /** + * Create boss bar for an illusioner. + * + * @param plugin The plugin that owns the boss bar. + * @param color The color of the boss bar. + * @param style The style of the boss bar. + * @return The created boss bar. + */ + BossBar createBossbar(@NotNull Plugin plugin, + @NotNull BarColor color, + @NotNull BarStyle style); +} diff --git a/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/IllusionerHelperProxy.java b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/IllusionerHelperProxy.java new file mode 100644 index 0000000..b58c106 --- /dev/null +++ b/eco-core/core-proxy/src/main/java/com/willfp/illusioner/proxy/proxies/IllusionerHelperProxy.java @@ -0,0 +1,38 @@ +package com.willfp.illusioner.proxy.proxies; + +import com.willfp.eco.util.proxy.AbstractProxy; +import org.bukkit.Location; +import org.bukkit.entity.Illusioner; +import org.jetbrains.annotations.NotNull; + +public interface IllusionerHelperProxy extends AbstractProxy { + /** + * Spawn an illusioner. + * + * @param location The location to spawn it at. + * @param maxHealth The health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + * @return The created illusioner. + */ + EntityIllusionerProxy spawn(@NotNull Location location, + double maxHealth, + double attackDamage, + @NotNull String name); + + /** + * Convert a normal illusioner to a plugin-based one. + * + * @param illusioner The illusioner to convert. + * @param location The location to spawn it at. + * @param maxHealth The health for the illusioner to have. + * @param attackDamage The attack damage for the illusioner to have. + * @param name The name of the illusioner. + * @return The created illusioner. + */ + EntityIllusionerProxy adapt(@NotNull Illusioner illusioner, + @NotNull Location location, + double maxHealth, + double attackDamage, + @NotNull String name); +} diff --git a/gradle.properties b/gradle.properties index b353cf0..24d57c5 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ -version = 1.1.0 +version = 2.0.0 plugin-name = Illusioner \ No newline at end of file diff --git a/lib/SpartanAPI.jar b/lib/SpartanAPI.jar new file mode 100644 index 0000000..1f2d578 Binary files /dev/null and b/lib/SpartanAPI.jar differ diff --git a/lib/aac-api-5.0.0.jar b/lib/aac-api-5.0.0.jar new file mode 100644 index 0000000..3222990 Binary files /dev/null and b/lib/aac-api-5.0.0.jar differ diff --git a/settings.gradle b/settings.gradle index 9592b4a..8d2a437 100644 --- a/settings.gradle +++ b/settings.gradle @@ -1,14 +1,11 @@ -rootProject.name = 'parent' -include('v1_15_R1') -include('plugin') -include('API') -include('v1_16_R1') -include('v1_16_R2') -include('v1_16_R3') +rootProject.name = 'Illusioner' -project(":v1_15_R1").projectDir = file('NMS/v1_15_R1') -project(":plugin").projectDir = file('Plugin') -project(":API").projectDir = file('NMS/API') -project(":v1_16_R1").projectDir = file('NMS/v1_16_R1') -project(":v1_16_R2").projectDir = file('NMS/v1_16_R2') -project(":v1_16_R3").projectDir = file('NMS/v1_16_R3') \ No newline at end of file +// Core +include ':eco-core' +include ':eco-core:core-nms' +include ':eco-core:core-nms:v1_15_R1' +include ':eco-core:core-nms:v1_16_R1' +include ':eco-core:core-nms:v1_16_R2' +include ':eco-core:core-nms:v1_16_R3' +include ':eco-core:core-proxy' +include ':eco-core:core-plugin' \ No newline at end of file