diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..f288702
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,674 @@
+ GNU GENERAL PUBLIC LICENSE
+ Version 3, 29 June 2007
+
+ Copyright (C) 2007 Free Software Foundation, Inc.
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+ Preamble
+
+ The GNU General Public License is a free, copyleft license for
+software and other kinds of works.
+
+ The licenses for most software and other practical works are designed
+to take away your freedom to share and change the works. By contrast,
+the GNU General Public License is intended to guarantee your freedom to
+share and change all versions of a program--to make sure it remains free
+software for all its users. We, the Free Software Foundation, use the
+GNU General Public License for most of our software; it applies also to
+any other work released this way by its authors. You can apply it to
+your programs, too.
+
+ When we speak of free software, we are referring to freedom, not
+price. Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+them if you wish), that you receive source code or can get it if you
+want it, that you can change the software or use pieces of it in new
+free programs, and that you know you can do these things.
+
+ To protect your rights, we need to prevent others from denying you
+these rights or asking you to surrender the rights. Therefore, you have
+certain responsibilities if you distribute copies of the software, or if
+you modify it: responsibilities to respect the freedom of others.
+
+ For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must pass on to the recipients the same
+freedoms that you received. You must make sure that they, too, receive
+or can get the source code. And you must show them these terms so they
+know their rights.
+
+ Developers that use the GNU GPL protect your rights with two steps:
+(1) assert copyright on the software, and (2) offer you this License
+giving you legal permission to copy, distribute and/or modify it.
+
+ For the developers' and authors' protection, the GPL clearly explains
+that there is no warranty for this free software. For both users' and
+authors' sake, the GPL requires that modified versions be marked as
+changed, so that their problems will not be attributed erroneously to
+authors of previous versions.
+
+ Some devices are designed to deny users access to install or run
+modified versions of the software inside them, although the manufacturer
+can do so. This is fundamentally incompatible with the aim of
+protecting users' freedom to change the software. The systematic
+pattern of such abuse occurs in the area of products for individuals to
+use, which is precisely where it is most unacceptable. Therefore, we
+have designed this version of the GPL to prohibit the practice for those
+products. If such problems arise substantially in other domains, we
+stand ready to extend this provision to those domains in future versions
+of the GPL, as needed to protect the freedom of users.
+
+ Finally, every program is threatened constantly by software patents.
+States should not allow patents to restrict development and use of
+software on general-purpose computers, but in those that do, we wish to
+avoid the special danger that patents applied to a free program could
+make it effectively proprietary. To prevent this, the GPL assures that
+patents cannot be used to render the program non-free.
+
+ The precise terms and conditions for copying, distribution and
+modification follow.
+
+ TERMS AND CONDITIONS
+
+ 0. Definitions.
+
+ "This License" refers to version 3 of the GNU General Public License.
+
+ "Copyright" also means copyright-like laws that apply to other kinds of
+works, such as semiconductor masks.
+
+ "The Program" refers to any copyrightable work licensed under this
+License. Each licensee is addressed as "you". "Licensees" and
+"recipients" may be individuals or organizations.
+
+ To "modify" a work means to copy from or adapt all or part of the work
+in a fashion requiring copyright permission, other than the making of an
+exact copy. The resulting work is called a "modified version" of the
+earlier work or a work "based on" the earlier work.
+
+ A "covered work" means either the unmodified Program or a work based
+on the Program.
+
+ To "propagate" a work means to do anything with it that, without
+permission, would make you directly or secondarily liable for
+infringement under applicable copyright law, except executing it on a
+computer or modifying a private copy. Propagation includes copying,
+distribution (with or without modification), making available to the
+public, and in some countries other activities as well.
+
+ To "convey" a work means any kind of propagation that enables other
+parties to make or receive copies. Mere interaction with a user through
+a computer network, with no transfer of a copy, is not conveying.
+
+ An interactive user interface displays "Appropriate Legal Notices"
+to the extent that it includes a convenient and prominently visible
+feature that (1) displays an appropriate copyright notice, and (2)
+tells the user that there is no warranty for the work (except to the
+extent that warranties are provided), that licensees may convey the
+work under this License, and how to view a copy of this License. If
+the interface presents a list of user commands or options, such as a
+menu, a prominent item in the list meets this criterion.
+
+ 1. Source Code.
+
+ The "source code" for a work means the preferred form of the work
+for making modifications to it. "Object code" means any non-source
+form of a work.
+
+ A "Standard Interface" means an interface that either is an official
+standard defined by a recognized standards body, or, in the case of
+interfaces specified for a particular programming language, one that
+is widely used among developers working in that language.
+
+ The "System Libraries" of an executable work include anything, other
+than the work as a whole, that (a) is included in the normal form of
+packaging a Major Component, but which is not part of that Major
+Component, and (b) serves only to enable use of the work with that
+Major Component, or to implement a Standard Interface for which an
+implementation is available to the public in source code form. A
+"Major Component", in this context, means a major essential component
+(kernel, window system, and so on) of the specific operating system
+(if any) on which the executable work runs, or a compiler used to
+produce the work, or an object code interpreter used to run it.
+
+ The "Corresponding Source" for a work in object code form means all
+the source code needed to generate, install, and (for an executable
+work) run the object code and to modify the work, including scripts to
+control those activities. However, it does not include the work's
+System Libraries, or general-purpose tools or generally available free
+programs which are used unmodified in performing those activities but
+which are not part of the work. For example, Corresponding Source
+includes interface definition files associated with source files for
+the work, and the source code for shared libraries and dynamically
+linked subprograms that the work is specifically designed to require,
+such as by intimate data communication or control flow between those
+subprograms and other parts of the work.
+
+ The Corresponding Source need not include anything that users
+can regenerate automatically from other parts of the Corresponding
+Source.
+
+ The Corresponding Source for a work in source code form is that
+same work.
+
+ 2. Basic Permissions.
+
+ All rights granted under this License are granted for the term of
+copyright on the Program, and are irrevocable provided the stated
+conditions are met. This License explicitly affirms your unlimited
+permission to run the unmodified Program. The output from running a
+covered work is covered by this License only if the output, given its
+content, constitutes a covered work. This License acknowledges your
+rights of fair use or other equivalent, as provided by copyright law.
+
+ You may make, run and propagate covered works that you do not
+convey, without conditions so long as your license otherwise remains
+in force. You may convey covered works to others for the sole purpose
+of having them make modifications exclusively for you, or provide you
+with facilities for running those works, provided that you comply with
+the terms of this License in conveying all material for which you do
+not control copyright. Those thus making or running the covered works
+for you must do so exclusively on your behalf, under your direction
+and control, on terms that prohibit them from making any copies of
+your copyrighted material outside their relationship with you.
+
+ Conveying under any other circumstances is permitted solely under
+the conditions stated below. Sublicensing is not allowed; section 10
+makes it unnecessary.
+
+ 3. Protecting Users' Legal Rights From Anti-Circumvention Law.
+
+ No covered work shall be deemed part of an effective technological
+measure under any applicable law fulfilling obligations under article
+11 of the WIPO copyright treaty adopted on 20 December 1996, or
+similar laws prohibiting or restricting circumvention of such
+measures.
+
+ When you convey a covered work, you waive any legal power to forbid
+circumvention of technological measures to the extent such circumvention
+is effected by exercising rights under this License with respect to
+the covered work, and you disclaim any intention to limit operation or
+modification of the work as a means of enforcing, against the work's
+users, your or third parties' legal rights to forbid circumvention of
+technological measures.
+
+ 4. Conveying Verbatim Copies.
+
+ You may convey verbatim copies of the Program's source code as you
+receive it, in any medium, provided that you conspicuously and
+appropriately publish on each copy an appropriate copyright notice;
+keep intact all notices stating that this License and any
+non-permissive terms added in accord with section 7 apply to the code;
+keep intact all notices of the absence of any warranty; and give all
+recipients a copy of this License along with the Program.
+
+ You may charge any price or no price for each copy that you convey,
+and you may offer support or warranty protection for a fee.
+
+ 5. Conveying Modified Source Versions.
+
+ You may convey a work based on the Program, or the modifications to
+produce it from the Program, in the form of source code under the
+terms of section 4, provided that you also meet all of these conditions:
+
+ a) The work must carry prominent notices stating that you modified
+ it, and giving a relevant date.
+
+ b) The work must carry prominent notices stating that it is
+ released under this License and any conditions added under section
+ 7. This requirement modifies the requirement in section 4 to
+ "keep intact all notices".
+
+ c) You must license the entire work, as a whole, under this
+ License to anyone who comes into possession of a copy. This
+ License will therefore apply, along with any applicable section 7
+ additional terms, to the whole of the work, and all its parts,
+ regardless of how they are packaged. This License gives no
+ permission to license the work in any other way, but it does not
+ invalidate such permission if you have separately received it.
+
+ d) If the work has interactive user interfaces, each must display
+ Appropriate Legal Notices; however, if the Program has interactive
+ interfaces that do not display Appropriate Legal Notices, your
+ work need not make them do so.
+
+ A compilation of a covered work with other separate and independent
+works, which are not by their nature extensions of the covered work,
+and which are not combined with it such as to form a larger program,
+in or on a volume of a storage or distribution medium, is called an
+"aggregate" if the compilation and its resulting copyright are not
+used to limit the access or legal rights of the compilation's users
+beyond what the individual works permit. Inclusion of a covered work
+in an aggregate does not cause this License to apply to the other
+parts of the aggregate.
+
+ 6. Conveying Non-Source Forms.
+
+ You may convey a covered work in object code form under the terms
+of sections 4 and 5, provided that you also convey the
+machine-readable Corresponding Source under the terms of this License,
+in one of these ways:
+
+ a) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by the
+ Corresponding Source fixed on a durable physical medium
+ customarily used for software interchange.
+
+ b) Convey the object code in, or embodied in, a physical product
+ (including a physical distribution medium), accompanied by a
+ written offer, valid for at least three years and valid for as
+ long as you offer spare parts or customer support for that product
+ model, to give anyone who possesses the object code either (1) a
+ copy of the Corresponding Source for all the software in the
+ product that is covered by this License, on a durable physical
+ medium customarily used for software interchange, for a price no
+ more than your reasonable cost of physically performing this
+ conveying of source, or (2) access to copy the
+ Corresponding Source from a network server at no charge.
+
+ c) Convey individual copies of the object code with a copy of the
+ written offer to provide the Corresponding Source. This
+ alternative is allowed only occasionally and noncommercially, and
+ only if you received the object code with such an offer, in accord
+ with subsection 6b.
+
+ d) Convey the object code by offering access from a designated
+ place (gratis or for a charge), and offer equivalent access to the
+ Corresponding Source in the same way through the same place at no
+ further charge. You need not require recipients to copy the
+ Corresponding Source along with the object code. If the place to
+ copy the object code is a network server, the Corresponding Source
+ may be on a different server (operated by you or a third party)
+ that supports equivalent copying facilities, provided you maintain
+ clear directions next to the object code saying where to find the
+ Corresponding Source. Regardless of what server hosts the
+ Corresponding Source, you remain obligated to ensure that it is
+ available for as long as needed to satisfy these requirements.
+
+ e) Convey the object code using peer-to-peer transmission, provided
+ you inform other peers where the object code and Corresponding
+ Source of the work are being offered to the general public at no
+ charge under subsection 6d.
+
+ A separable portion of the object code, whose source code is excluded
+from the Corresponding Source as a System Library, need not be
+included in conveying the object code work.
+
+ A "User Product" is either (1) a "consumer product", which means any
+tangible personal property which is normally used for personal, family,
+or household purposes, or (2) anything designed or sold for incorporation
+into a dwelling. In determining whether a product is a consumer product,
+doubtful cases shall be resolved in favor of coverage. For a particular
+product received by a particular user, "normally used" refers to a
+typical or common use of that class of product, regardless of the status
+of the particular user or of the way in which the particular user
+actually uses, or expects or is expected to use, the product. A product
+is a consumer product regardless of whether the product has substantial
+commercial, industrial or non-consumer uses, unless such uses represent
+the only significant mode of use of the product.
+
+ "Installation Information" for a User Product means any methods,
+procedures, authorization keys, or other information required to install
+and execute modified versions of a covered work in that User Product from
+a modified version of its Corresponding Source. The information must
+suffice to ensure that the continued functioning of the modified object
+code is in no case prevented or interfered with solely because
+modification has been made.
+
+ If you convey an object code work under this section in, or with, or
+specifically for use in, a User Product, and the conveying occurs as
+part of a transaction in which the right of possession and use of the
+User Product is transferred to the recipient in perpetuity or for a
+fixed term (regardless of how the transaction is characterized), the
+Corresponding Source conveyed under this section must be accompanied
+by the Installation Information. But this requirement does not apply
+if neither you nor any third party retains the ability to install
+modified object code on the User Product (for example, the work has
+been installed in ROM).
+
+ The requirement to provide Installation Information does not include a
+requirement to continue to provide support service, warranty, or updates
+for a work that has been modified or installed by the recipient, or for
+the User Product in which it has been modified or installed. Access to a
+network may be denied when the modification itself materially and
+adversely affects the operation of the network or violates the rules and
+protocols for communication across the network.
+
+ Corresponding Source conveyed, and Installation Information provided,
+in accord with this section must be in a format that is publicly
+documented (and with an implementation available to the public in
+source code form), and must require no special password or key for
+unpacking, reading or copying.
+
+ 7. Additional Terms.
+
+ "Additional permissions" are terms that supplement the terms of this
+License by making exceptions from one or more of its conditions.
+Additional permissions that are applicable to the entire Program shall
+be treated as though they were included in this License, to the extent
+that they are valid under applicable law. If additional permissions
+apply only to part of the Program, that part may be used separately
+under those permissions, but the entire Program remains governed by
+this License without regard to the additional permissions.
+
+ When you convey a copy of a covered work, you may at your option
+remove any additional permissions from that copy, or from any part of
+it. (Additional permissions may be written to require their own
+removal in certain cases when you modify the work.) You may place
+additional permissions on material, added by you to a covered work,
+for which you have or can give appropriate copyright permission.
+
+ Notwithstanding any other provision of this License, for material you
+add to a covered work, you may (if authorized by the copyright holders of
+that material) supplement the terms of this License with terms:
+
+ a) Disclaiming warranty or limiting liability differently from the
+ terms of sections 15 and 16 of this License; or
+
+ b) Requiring preservation of specified reasonable legal notices or
+ author attributions in that material or in the Appropriate Legal
+ Notices displayed by works containing it; or
+
+ c) Prohibiting misrepresentation of the origin of that material, or
+ requiring that modified versions of such material be marked in
+ reasonable ways as different from the original version; or
+
+ d) Limiting the use for publicity purposes of names of licensors or
+ authors of the material; or
+
+ e) Declining to grant rights under trademark law for use of some
+ trade names, trademarks, or service marks; or
+
+ f) Requiring indemnification of licensors and authors of that
+ material by anyone who conveys the material (or modified versions of
+ it) with contractual assumptions of liability to the recipient, for
+ any liability that these contractual assumptions directly impose on
+ those licensors and authors.
+
+ All other non-permissive additional terms are considered "further
+restrictions" within the meaning of section 10. If the Program as you
+received it, or any part of it, contains a notice stating that it is
+governed by this License along with a term that is a further
+restriction, you may remove that term. If a license document contains
+a further restriction but permits relicensing or conveying under this
+License, you may add to a covered work material governed by the terms
+of that license document, provided that the further restriction does
+not survive such relicensing or conveying.
+
+ If you add terms to a covered work in accord with this section, you
+must place, in the relevant source files, a statement of the
+additional terms that apply to those files, or a notice indicating
+where to find the applicable terms.
+
+ Additional terms, permissive or non-permissive, may be stated in the
+form of a separately written license, or stated as exceptions;
+the above requirements apply either way.
+
+ 8. Termination.
+
+ You may not propagate or modify a covered work except as expressly
+provided under this License. Any attempt otherwise to propagate or
+modify it is void, and will automatically terminate your rights under
+this License (including any patent licenses granted under the third
+paragraph of section 11).
+
+ However, if you cease all violation of this License, then your
+license from a particular copyright holder is reinstated (a)
+provisionally, unless and until the copyright holder explicitly and
+finally terminates your license, and (b) permanently, if the copyright
+holder fails to notify you of the violation by some reasonable means
+prior to 60 days after the cessation.
+
+ Moreover, your license from a particular copyright holder is
+reinstated permanently if the copyright holder notifies you of the
+violation by some reasonable means, this is the first time you have
+received notice of violation of this License (for any work) from that
+copyright holder, and you cure the violation prior to 30 days after
+your receipt of the notice.
+
+ Termination of your rights under this section does not terminate the
+licenses of parties who have received copies or rights from you under
+this License. If your rights have been terminated and not permanently
+reinstated, you do not qualify to receive new licenses for the same
+material under section 10.
+
+ 9. Acceptance Not Required for Having Copies.
+
+ You are not required to accept this License in order to receive or
+run a copy of the Program. Ancillary propagation of a covered work
+occurring solely as a consequence of using peer-to-peer transmission
+to receive a copy likewise does not require acceptance. However,
+nothing other than this License grants you permission to propagate or
+modify any covered work. These actions infringe copyright if you do
+not accept this License. Therefore, by modifying or propagating a
+covered work, you indicate your acceptance of this License to do so.
+
+ 10. Automatic Licensing of Downstream Recipients.
+
+ Each time you convey a covered work, the recipient automatically
+receives a license from the original licensors, to run, modify and
+propagate that work, subject to this License. You are not responsible
+for enforcing compliance by third parties with this License.
+
+ An "entity transaction" is a transaction transferring control of an
+organization, or substantially all assets of one, or subdividing an
+organization, or merging organizations. If propagation of a covered
+work results from an entity transaction, each party to that
+transaction who receives a copy of the work also receives whatever
+licenses to the work the party's predecessor in interest had or could
+give under the previous paragraph, plus a right to possession of the
+Corresponding Source of the work from the predecessor in interest, if
+the predecessor has it or can get it with reasonable efforts.
+
+ You may not impose any further restrictions on the exercise of the
+rights granted or affirmed under this License. For example, you may
+not impose a license fee, royalty, or other charge for exercise of
+rights granted under this License, and you may not initiate litigation
+(including a cross-claim or counterclaim in a lawsuit) alleging that
+any patent claim is infringed by making, using, selling, offering for
+sale, or importing the Program or any portion of it.
+
+ 11. Patents.
+
+ A "contributor" is a copyright holder who authorizes use under this
+License of the Program or a work on which the Program is based. The
+work thus licensed is called the contributor's "contributor version".
+
+ A contributor's "essential patent claims" are all patent claims
+owned or controlled by the contributor, whether already acquired or
+hereafter acquired, that would be infringed by some manner, permitted
+by this License, of making, using, or selling its contributor version,
+but do not include claims that would be infringed only as a
+consequence of further modification of the contributor version. For
+purposes of this definition, "control" includes the right to grant
+patent sublicenses in a manner consistent with the requirements of
+this License.
+
+ Each contributor grants you a non-exclusive, worldwide, royalty-free
+patent license under the contributor's essential patent claims, to
+make, use, sell, offer for sale, import and otherwise run, modify and
+propagate the contents of its contributor version.
+
+ In the following three paragraphs, a "patent license" is any express
+agreement or commitment, however denominated, not to enforce a patent
+(such as an express permission to practice a patent or covenant not to
+sue for patent infringement). To "grant" such a patent license to a
+party means to make such an agreement or commitment not to enforce a
+patent against the party.
+
+ If you convey a covered work, knowingly relying on a patent license,
+and the Corresponding Source of the work is not available for anyone
+to copy, free of charge and under the terms of this License, through a
+publicly available network server or other readily accessible means,
+then you must either (1) cause the Corresponding Source to be so
+available, or (2) arrange to deprive yourself of the benefit of the
+patent license for this particular work, or (3) arrange, in a manner
+consistent with the requirements of this License, to extend the patent
+license to downstream recipients. "Knowingly relying" means you have
+actual knowledge that, but for the patent license, your conveying the
+covered work in a country, or your recipient's use of the covered work
+in a country, would infringe one or more identifiable patents in that
+country that you have reason to believe are valid.
+
+ If, pursuant to or in connection with a single transaction or
+arrangement, you convey, or propagate by procuring conveyance of, a
+covered work, and grant a patent license to some of the parties
+receiving the covered work authorizing them to use, propagate, modify
+or convey a specific copy of the covered work, then the patent license
+you grant is automatically extended to all recipients of the covered
+work and works based on it.
+
+ A patent license is "discriminatory" if it does not include within
+the scope of its coverage, prohibits the exercise of, or is
+conditioned on the non-exercise of one or more of the rights that are
+specifically granted under this License. You may not convey a covered
+work if you are a party to an arrangement with a third party that is
+in the business of distributing software, under which you make payment
+to the third party based on the extent of your activity of conveying
+the work, and under which the third party grants, to any of the
+parties who would receive the covered work from you, a discriminatory
+patent license (a) in connection with copies of the covered work
+conveyed by you (or copies made from those copies), or (b) primarily
+for and in connection with specific products or compilations that
+contain the covered work, unless you entered into that arrangement,
+or that patent license was granted, prior to 28 March 2007.
+
+ Nothing in this License shall be construed as excluding or limiting
+any implied license or other defenses to infringement that may
+otherwise be available to you under applicable patent law.
+
+ 12. No Surrender of Others' Freedom.
+
+ If conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot convey a
+covered work so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you may
+not convey it at all. For example, if you agree to terms that obligate you
+to collect a royalty for further conveying from those to whom you convey
+the Program, the only way you could satisfy both those terms and this
+License would be to refrain entirely from conveying the Program.
+
+ 13. Use with the GNU Affero General Public License.
+
+ Notwithstanding any other provision of this License, you have
+permission to link or combine any covered work with a work licensed
+under version 3 of the GNU Affero General Public License into a single
+combined work, and to convey the resulting work. The terms of this
+License will continue to apply to the part which is the covered work,
+but the special requirements of the GNU Affero General Public License,
+section 13, concerning interaction through a network will apply to the
+combination as such.
+
+ 14. Revised Versions of this License.
+
+ The Free Software Foundation may publish revised and/or new versions of
+the GNU General Public License from time to time. Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+ Each version is given a distinguishing version number. If the
+Program specifies that a certain numbered version of the GNU General
+Public License "or any later version" applies to it, you have the
+option of following the terms and conditions either of that numbered
+version or of any later version published by the Free Software
+Foundation. If the Program does not specify a version number of the
+GNU General Public License, you may choose any version ever published
+by the Free Software Foundation.
+
+ If the Program specifies that a proxy can decide which future
+versions of the GNU General Public License can be used, that proxy's
+public statement of acceptance of a version permanently authorizes you
+to choose that version for the Program.
+
+ Later license versions may give you additional or different
+permissions. However, no additional obligations are imposed on any
+author or copyright holder as a result of your choosing to follow a
+later version.
+
+ 15. Disclaimer of Warranty.
+
+ THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
+APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
+HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
+OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
+IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
+ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. Limitation of Liability.
+
+ IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
+THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
+GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
+USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
+DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
+PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
+EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGES.
+
+ 17. Interpretation of Sections 15 and 16.
+
+ If the disclaimer of warranty and limitation of liability provided
+above cannot be given local legal effect according to their terms,
+reviewing courts shall apply local law that most closely approximates
+an absolute waiver of all civil liability in connection with the
+Program, unless a warranty or assumption of liability accompanies a
+copy of the Program in return for a fee.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Programs
+
+ If you develop a new program, and you want it to be of the greatest
+possible use to the public, the best way to achieve this is to make it
+free software which everyone can redistribute and change under these terms.
+
+ To do so, attach the following notices to the program. It is safest
+to attach them to the start of each source file to most effectively
+state the exclusion of warranty; and each file should have at least
+the "copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This program is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program. If not, see .
+
+Also add information on how to contact you by electronic and paper mail.
+
+ If the program does terminal interaction, make it output a short
+notice like this when it starts in an interactive mode:
+
+ Copyright (C)
+ This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
+ This is free software, and you are welcome to redistribute it
+ under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate
+parts of the General Public License. Of course, your program's commands
+might be different; for a GUI interface, you would use an "about box".
+
+ You should also get your employer (if you work as a programmer) or school,
+if any, to sign a "copyright disclaimer" for the program, if necessary.
+For more information on this, and how to apply and follow the GNU GPL, see
+.
+
+ The GNU General Public License does not permit incorporating your program
+into proprietary programs. If your program is a subroutine library, you
+may consider it more useful to permit linking proprietary applications with
+the library. If this is what you want to do, use the GNU Lesser General
+Public License instead of this License. But first, please read
+.
diff --git a/README.md b/README.md
index 319f358..7e95224 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,14 @@
-
-
-# This project is currently under recoding
-
# Custom-Crops
-StardewValley Like Farming System
+
+
+
+
+[](https://jitpack.io/#Xiao-MoMi/Custom-Crops)
+
+
+
+
+Ultra-customizable planting experience for Minecraft servers
### Support the developer
@@ -69,41 +74,3 @@ dependencies {
compileOnly("com.github.Xiao-MoMi:Custom-Crops:{LATEST}")
}
```
-
-### API Guide
-```access transformers
-public class YourClass {
-
- private CustomCropsAPI api;
-
- public YourClass() {
- api = CustomCropsAPI.getInstance();
- }
-
- public void yourMethod() {
- api.xxx();
- }
-}
-```
-
-#### Events
-```
-CropBreakEvent
-CropInteractEvent
-CropPlantEvent
-FertilizerUseEvent
-GreenhouseGlassBreakEvent
-GreenhouseGlassPlaceEvent
-PotBreakEvent
-PotInfoEvent
-PotInteractEvent
-PotPlaceEvent
-PotWaterEvent
-ScarecrowBreakEvent
-ScarecrowPlaceEvent
-SprinklerFillEvent
-SprinklerPlaceEvent
-SprinklerInteractEvent
-SprinklerBreakEvent
-SeasonChangeEvent
-```
diff --git a/api/build.gradle.kts b/api/build.gradle.kts
index 367c9bb..7aa76c7 100644
--- a/api/build.gradle.kts
+++ b/api/build.gradle.kts
@@ -1,3 +1,4 @@
dependencies {
- compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
+ compileOnly("io.papermc.paper:paper-api:1.20.4-R0.1-SNAPSHOT")
+ implementation("com.flowpowered:flow-nbt:2.0.2")
}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsAPI.java b/api/src/main/java/net/momirealms/customcrops/api/CustomCropsAPI.java
deleted file mode 100644
index dbd2596..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsAPI.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api;
-
-import net.momirealms.customcrops.api.object.CCGrowingCrop;
-import net.momirealms.customcrops.api.object.CCPot;
-import net.momirealms.customcrops.api.object.CCSprinkler;
-import net.momirealms.customcrops.api.object.CCWorldSeason;
-import org.bukkit.Location;
-import org.bukkit.World;
-
-import javax.annotation.Nullable;
-
-public interface CustomCropsAPI {
-
- /**
- * Get the pot instance at the specified location
- * In order to reduce the memory usage, pot data would be removed
- * if it has no water and no fertilizer
- * But if "only-work-in-loaded-chunks" is true, pot data would not be removed
- * @param location location
- * @return pot
- */
- @Nullable
- CCPot getPotAt(Location location);
-
- /**
- * Get the on growing crop at the specified location
- * It would be null if the crop already comes to its final stage
- * @param location location
- * @return on growing crop
- */
- @Nullable
- CCGrowingCrop getCropAt(Location location);
-
- /**
- * If the block is a greenhouse glass in data
- * It would return false if your greenhouse glass lost due to server crash
- * @param location location
- * @return whether the block is greenhouse glass
- */
- boolean isGreenhouseGlass(Location location);
-
- /**
- * If the chunk has a scarecrow
- * @param location location
- * @return has scarecrow or not
- */
- boolean hasScarecrowInChunk(Location location);
-
- /**
- * Get the sprinkler at the specified location
- * It would be null if the sprinkler run out of water
- * @param location location
- * @return sprinkler
- */
- @Nullable
- CCSprinkler getSprinklerAt(Location location);
-
- /**
- * Set the world's season
- * @param world world
- * @param season season
- */
- void setSeason(String world, String season);
-
- /**
- * Set the world's date
- * @param world world
- * @param date date
- */
- void setDate(String world, int date);
-
- /**
- * Add a world's date
- * @param world world
- */
- void addDate(String world);
-
- /**
- * Get a world's season
- * @param world world
- * @return season
- */
- @Nullable
- CCWorldSeason getSeason(String world);
-
- /**
- * Force the crops to grow in specified seconds
- * @param world world
- * @param seconds time
- */
- void grow(World world, int seconds);
-
- /**
- * Force the sprinkler to work in specified seconds
- * @param world world
- * @param seconds time
- */
- void sprinklerWork(World world, int seconds);
-
- /**
- * Force the pots to reduce water and consume fertilizer in specified seconds
- * @param world world
- * @param seconds time
- */
- void consume(World world, int seconds);
-
- /**
- * Get the api instance
- * It would be null if the plugin is not enabled
- * @return api
- */
- @Nullable
- static CustomCropsAPI getInstance() {
- return CustomCropsPlugin.getInstance().getAPI();
- }
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java b/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java
index 1998c16..215f315 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/CustomCropsPlugin.java
@@ -17,19 +17,107 @@
package net.momirealms.customcrops.api;
+import net.momirealms.customcrops.api.manager.*;
+import net.momirealms.customcrops.api.scheduler.Scheduler;
import org.bukkit.plugin.java.JavaPlugin;
public abstract class CustomCropsPlugin extends JavaPlugin {
protected static CustomCropsPlugin instance;
+ protected VersionManager versionManager;
+ protected ConfigManager configManager;
+ protected Scheduler scheduler;
+ protected RequirementManager requirementManager;
+ protected ActionManager actionManager;
+ protected IntegrationManager integrationManager;
+ protected CoolDownManager coolDownManager;
+ protected WorldManager worldManager;
+ protected ItemManager itemManager;
+ protected AdventureManager adventure;
+ protected MessageManager messageManager;
+ protected ConditionManager conditionManager;
+ protected PlaceholderManager placeholderManager;
- protected CustomCropsAPI customCropsAPI;
-
- public CustomCropsAPI getAPI() {
- return customCropsAPI;
+ public CustomCropsPlugin() {
+ instance = this;
}
public static CustomCropsPlugin getInstance() {
return instance;
}
+
+ public static CustomCropsPlugin get() {
+ return instance;
+ }
+
+ /* Get version manager */
+ public VersionManager getVersionManager() {
+ return versionManager;
+ }
+
+ /* Get config manager */
+ public ConfigManager getConfigManager() {
+ return configManager;
+ }
+
+ /* Get scheduler */
+ public Scheduler getScheduler() {
+ return scheduler;
+ }
+
+ /* Get requirement manager */
+ public RequirementManager getRequirementManager() {
+ return requirementManager;
+ }
+
+ /* Get integration manager */
+ public IntegrationManager getIntegrationManager() {
+ return integrationManager;
+ }
+
+ /* Get action manager */
+ public ActionManager getActionManager() {
+ return actionManager;
+ }
+
+ /* Get cool down manager */
+ public CoolDownManager getCoolDownManager() {
+ return coolDownManager;
+ }
+
+ /* Get world data manager */
+ public WorldManager getWorldManager() {
+ return worldManager;
+ }
+
+ /* Get item manager */
+ public ItemManager getItemManager() {
+ return itemManager;
+ }
+
+ /* Get message manager */
+ public MessageManager getMessageManager() {
+ return messageManager;
+ }
+
+ /* Get adventure manager */
+ public AdventureManager getAdventure() {
+ return adventure;
+ }
+
+ /* Get condition manager */
+ public ConditionManager getConditionManager() {
+ return conditionManager;
+ }
+
+ /* Get placeholder manager */
+ public PlaceholderManager getPlaceholderManager() {
+ return placeholderManager;
+ }
+
+ public abstract boolean isHookedPluginEnabled(String plugin);
+
+ public abstract void debug(String debug);
+
+ public abstract void reload();
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/integration/SkillInterface.java b/api/src/main/java/net/momirealms/customcrops/api/common/Initable.java
similarity index 78%
rename from plugin/src/main/java/net/momirealms/customcrops/integration/SkillInterface.java
rename to api/src/main/java/net/momirealms/customcrops/api/common/Initable.java
index d69466b..792ce4e 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/integration/SkillInterface.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/Initable.java
@@ -15,13 +15,11 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.integration;
+package net.momirealms.customcrops.api.common;
-import org.bukkit.entity.Player;
+public interface Initable {
-public interface SkillInterface {
+ void init();
- void addXp(Player player, double amount);
-
- int getLevel(Player player);
+ void disable();
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/Pair.java b/api/src/main/java/net/momirealms/customcrops/api/common/Pair.java
similarity index 94%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/Pair.java
rename to api/src/main/java/net/momirealms/customcrops/api/common/Pair.java
index 4616c5f..1c9ac50 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/Pair.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/Pair.java
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.common;
public record Pair(L left, R right) {
diff --git a/api/src/main/java/net/momirealms/customcrops/api/common/Property.java b/api/src/main/java/net/momirealms/customcrops/api/common/Property.java
new file mode 100644
index 0000000..f75361b
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/Property.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.common;
+
+public interface Property {
+ T get();
+ void set(T value);
+}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/common/Reloadable.java b/api/src/main/java/net/momirealms/customcrops/api/common/Reloadable.java
new file mode 100644
index 0000000..c19bc59
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/Reloadable.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.common;
+
+public interface Reloadable extends Initable {
+
+ @Override
+ default void init() {
+ load();
+ }
+
+ void load();
+
+ void unload();
+
+ @Override
+ default void disable() {
+ unload();
+ }
+
+ default void reload() {
+ unload();
+ load();
+ }
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/Tuple.java b/api/src/main/java/net/momirealms/customcrops/api/common/Tuple.java
similarity index 96%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/Tuple.java
rename to api/src/main/java/net/momirealms/customcrops/api/common/Tuple.java
index f2b12a0..f7789a0 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/Tuple.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/Tuple.java
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.common;
public class Tuple {
diff --git a/api/src/main/java/net/momirealms/customcrops/api/common/item/EventItem.java b/api/src/main/java/net/momirealms/customcrops/api/common/item/EventItem.java
new file mode 100644
index 0000000..9910df0
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/item/EventItem.java
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.common.item;
+
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+
+public interface EventItem {
+
+ void trigger(ActionTrigger actionTrigger, State state);
+
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/customplugin/Platform.java b/api/src/main/java/net/momirealms/customcrops/api/common/item/KeyItem.java
similarity index 87%
rename from plugin/src/main/java/net/momirealms/customcrops/customplugin/Platform.java
rename to api/src/main/java/net/momirealms/customcrops/api/common/item/KeyItem.java
index c1fd4ba..18b3448 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/customplugin/Platform.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/common/item/KeyItem.java
@@ -15,9 +15,9 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.customplugin;
+package net.momirealms.customcrops.api.common.item;
-public enum Platform {
- ItemsAdder,
- Oraxen
+public interface KeyItem {
+
+ String getKey();
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/CropBreakEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/CropBreakEvent.java
index 6510e07..0159699 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/CropBreakEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/CropBreakEvent.java
@@ -17,36 +17,33 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location;
-import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
-import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
+import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/**
* An event that triggered when breaking a crop
*/
-public class CropBreakEvent extends Event implements Cancellable {
+public class CropBreakEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
- private final String cropItemID;
- private final String cropKey;
private final Location location;
- private final Entity entity;
+ private final WorldCrop worldCrop;
public CropBreakEvent(
- @Nullable Entity entity,
- @NotNull String cropKey,
- @NotNull String cropItemID,
- @NotNull Location location
+ @NotNull Player player,
+ @NotNull Location location,
+ @Nullable WorldCrop worldCrop
) {
- this.entity = entity;
- this.cropItemID = cropItemID;
+ super(player);
this.location = location;
- this.cropKey = cropKey;
+ this.worldCrop = worldCrop;
}
@Override
@@ -71,12 +68,12 @@ public class CropBreakEvent extends Event implements Cancellable {
}
/**
- * Get the crop item id in IA/Oraxen
- * @return item id
+ * Get the crop's data, it might be null if it's spawned by other plugins in the wild
+ * @return crop data
*/
- @NotNull
- public String getCropItemID() {
- return cropItemID;
+ @Nullable
+ public WorldCrop getWorldCrop() {
+ return worldCrop;
}
/**
@@ -87,22 +84,4 @@ public class CropBreakEvent extends Event implements Cancellable {
public Location getLocation() {
return location;
}
-
- /**
- * Would be null if the crop is not broken by an entity
- * @return entity
- */
- @Nullable
- public Entity getEntity() {
- return entity;
- }
-
- /**
- * Get the crop config key
- * @return crop key
- */
- @NotNull
- public String getCropKey() {
- return cropKey;
- }
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/CropInteractEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/CropInteractEvent.java
index f3441b4..4f1fe41 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/CropInteractEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/CropInteractEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -24,6 +25,7 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
/**
* An event that triggered when a player interacts a crop
@@ -33,21 +35,18 @@ public class CropInteractEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
- private final String cropItemID;
- private final String cropKey;
+ private final WorldCrop crop;
private final ItemStack itemInHand;
public CropInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
- @NotNull String cropItemID,
- @NotNull String cropKey
+ @Nullable WorldCrop crop
) {
super(who);
- this.cropItemID = cropItemID;
this.location = location;
- this.cropKey = cropKey;
+ this.crop = crop;
this.itemInHand = itemInHand;
}
@@ -92,20 +91,11 @@ public class CropInteractEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the crop model item id
- * @return model item id
+ * Get the crop's data, it might be null if it's spawned by other plugins in the wild
+ * @return crop data
*/
- @NotNull
- public String getCropItemID() {
- return cropItemID;
- }
-
- /**
- * Get the crop config key
- * @return crop key
- */
- @NotNull
- public String getCropKey() {
- return cropKey;
+ @Nullable
+ public WorldCrop getCrop() {
+ return crop;
}
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/CropPlantEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/CropPlantEvent.java
index 479e929..2d55ab1 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/CropPlantEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/CropPlantEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.item.Crop;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -33,25 +34,22 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final ItemStack itemInHand;
- private final String cropKey;
+ private final Crop crop;
private final Location location;
private int point;
- private String cropItemID;
public CropPlantEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
- @NotNull String cropKey,
- int point,
- @NotNull String cropItemID
+ @NotNull Crop crop,
+ int point
) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
- this.cropKey = cropKey;
+ this.crop = crop;
this.point = point;
- this.cropItemID = cropItemID;
}
@Override
@@ -85,16 +83,18 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the crop config key
- * @return crop key
+ * Get the crop's config
+ *
+ * @return crop
*/
@NotNull
- public String getCropKey() {
- return cropKey;
+ public Crop getCrop() {
+ return crop;
}
/**
- * Get the crop location
+ * Get the crop's location
+ *
* @return location
*/
@NotNull
@@ -105,7 +105,7 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
/**
* Get the initial point
* It would be 0 when planting
- * but might be a value higher than 0 when replanting
+ *
* @return point
*/
public int getPoint() {
@@ -119,21 +119,4 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
public void setPoint(int point) {
this.point = point;
}
-
- /**
- * Get the crop stage model item id
- * @return crop model
- */
- @NotNull
- public String getCropModel() {
- return cropItemID;
- }
-
- /**
- * Set the crop model item id
- * @param cropItemID crop model item id
- */
- public void setCropModel(String cropItemID) {
- this.cropItemID = cropItemID;
- }
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/scheduler/BukkitSchedulerImpl.java b/api/src/main/java/net/momirealms/customcrops/api/event/CustomCropsReloadEvent.java
similarity index 51%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/scheduler/BukkitSchedulerImpl.java
rename to api/src/main/java/net/momirealms/customcrops/api/event/CustomCropsReloadEvent.java
index b0aec6b..4d939cf 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/scheduler/BukkitSchedulerImpl.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/CustomCropsReloadEvent.java
@@ -15,36 +15,33 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.scheduler;
+package net.momirealms.customcrops.api.event;
-import net.momirealms.customcrops.CustomCrops;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
+import net.momirealms.customcrops.api.CustomCropsPlugin;
+import org.bukkit.event.Event;
+import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull;
-import java.util.concurrent.Callable;
-import java.util.concurrent.Future;
+public class CustomCropsReloadEvent extends Event {
-public class BukkitSchedulerImpl implements SchedulerPlatform {
+ private static final HandlerList handlerList = new HandlerList();
+ private final CustomCropsPlugin plugin;
- private final CustomCrops plugin;
-
- public BukkitSchedulerImpl(CustomCrops plugin) {
+ public CustomCropsReloadEvent(CustomCropsPlugin plugin) {
this.plugin = plugin;
}
- @Override
- public Future callSyncMethod(@NotNull Callable task) {
- return Bukkit.getScheduler().callSyncMethod(plugin, task);
+ public static HandlerList getHandlerList() {
+ return handlerList;
}
+ @NotNull
@Override
- public void runTask(Runnable runnable) {
- Bukkit.getScheduler().runTask(plugin, runnable);
+ public HandlerList getHandlers() {
+ return getHandlerList();
}
- @Override
- public void runTask(Runnable runnable, Location location) {
- runTask(runnable);
+ public CustomCropsPlugin getPluginInstance() {
+ return plugin;
}
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/FertilizerUseEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/FertilizerUseEvent.java
deleted file mode 100644
index a53a2fc..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/event/FertilizerUseEvent.java
+++ /dev/null
@@ -1,98 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.event;
-
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * An event that triggered when player is using fertilizers
- */
-public class FertilizerUseEvent extends PlayerEvent implements Cancellable {
-
- private static final HandlerList handlers = new HandlerList();
- private boolean cancelled;
- private final ItemStack itemInHand;
- private final String fertilizerKey;
- private final Location location;
-
- public FertilizerUseEvent(
- @NotNull Player who,
- @NotNull ItemStack itemInHand,
- @NotNull String fertilizerKey,
- @NotNull Location location
- ) {
- super(who);
- this.itemInHand = itemInHand;
- this.fertilizerKey = fertilizerKey;
- this.location = location;
- }
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- /**
- * Get the fertilizer item in hand
- * @return fertilizer itemStack
- */
- @NotNull
- public ItemStack getItemInHand() {
- return itemInHand;
- }
-
- /**
- * Get the fertilizer config key
- * @return fertilizer key
- */
- @NotNull
- public String getFertilizerKey() {
- return fertilizerKey;
- }
-
- /**
- * Get the pot location
- * @return location
- */
- @NotNull
- public Location getLocation() {
- return location;
- }
-
- @NotNull
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- @NotNull
- @Override
- public HandlerList getHandlers() {
- return getHandlerList();
- }
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/PotBreakEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/PotBreakEvent.java
index 4365834..8815520 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/PotBreakEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/PotBreakEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location;
import org.bukkit.entity.Entity;
import org.bukkit.event.Cancellable;
@@ -33,17 +34,17 @@ public class PotBreakEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
- private final String potKey;
+ private final WorldPot pot;
private final Entity entity;
public PotBreakEvent(
@Nullable Entity entity,
@NotNull Location location,
- @NotNull String potKey
+ @NotNull WorldPot pot
) {
this.entity = entity;
this.location = location;
- this.potKey = potKey;
+ this.pot = pot;
}
@Override
@@ -76,13 +77,14 @@ public class PotBreakEvent extends Event implements Cancellable {
return location;
}
+
/**
- * Get the pot config key
- * @return pot key
+ * Get the pot's data
+ * @return pot
*/
@NotNull
- public String getPotKey() {
- return potKey;
+ public WorldPot getPot() {
+ return pot;
}
/**
@@ -93,4 +95,4 @@ public class PotBreakEvent extends Event implements Cancellable {
public Entity getEntity() {
return entity;
}
-}
+}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/PotInfoEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/PotInfoEvent.java
deleted file mode 100644
index e29983e..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/event/PotInfoEvent.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.event;
-
-import net.momirealms.customcrops.api.object.CCFertilizer;
-import net.momirealms.customcrops.api.object.CCGrowingCrop;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-/**
- * This event is called after a player interacted a pot
- * So the fertilizer/water would be updated
- */
-public class PotInfoEvent extends PlayerEvent {
-
- private static final HandlerList handlers = new HandlerList();
- private final CCFertilizer fertilizer;
- private final int water;
- private final CCGrowingCrop growingCrop;
- private final ItemStack itemInHand;
- private final Location location;
-
-
- public PotInfoEvent(
- @NotNull Player who,
- @NotNull Location location,
- @NotNull ItemStack itemInHand,
- @Nullable CCFertilizer fertilizer,
- int water,
- @Nullable CCGrowingCrop growingCrop
- ) {
- super(who);
- this.fertilizer = fertilizer;
- this.water = water;
- this.growingCrop = growingCrop;
- this.itemInHand = itemInHand;
- this.location = location;
- }
-
- @NotNull
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- @NotNull
- @Override
- public HandlerList getHandlers() {
- return getHandlerList();
- }
-
- /**
- * Get the fertilizer
- * @return fertilizer
- */
- @Nullable
- public CCFertilizer getFertilizer() {
- return fertilizer;
- }
-
- /**
- * Get the water amount
- * @return water amount
- */
- public int getWater() {
- return water;
- }
-
- /**
- * Get the on growing crop above the pot
- * It would be null if there's no crop or the crop is already ripe
- * @return crop
- */
- @Nullable
- public CCGrowingCrop getGrowingCrop() {
- return growingCrop;
- }
-
- /**
- * Get the item in player's hand
- * If there's nothing in hand, it would return AIR
- * @return item in hand
- */
- @NotNull
- public ItemStack getItemInHand() {
- return itemInHand;
- }
-
- /**
- * Get the pot location
- * @return location
- */
- @NotNull
- public Location getLocation() {
- return location;
- }
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/PotInteractEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/PotInteractEvent.java
index 24f36ed..52b947a 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/PotInteractEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/PotInteractEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -34,18 +35,18 @@ public class PotInteractEvent extends PlayerEvent implements Cancellable {
private boolean cancelled;
private final ItemStack itemInHand;
private final Location location;
- private final String potKey;
+ private final WorldPot pot;
public PotInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
- @NotNull String potKey
+ @NotNull WorldPot pot
) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
- this.potKey = potKey;
+ this.pot = pot;
}
@Override
@@ -93,11 +94,11 @@ public class PotInteractEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the pot's config key
+ * Get the pot's data
* @return pot key
*/
@NotNull
- public String getPotKey() {
- return potKey;
+ public WorldPot getPot() {
+ return pot;
}
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/PotPlaceEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/PotPlaceEvent.java
index 47712ce..875b1e3 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/PotPlaceEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/PotPlaceEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.item.Pot;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
- private final String potKey;
+ private final Pot pot;
public PotPlaceEvent(
@NotNull Player who,
@NotNull Location location,
- @NotNull String potKey
+ @NotNull Pot pot
) {
super(who);
this.location = location;
- this.potKey = potKey;
+ this.pot = pot;
}
@Override
@@ -75,11 +76,11 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the placed pot config key
- * @return pot key
+ * Get the placed pot's config
+ * @return pot
*/
@NotNull
- public String getPotKey() {
- return potKey;
+ public Pot getPot() {
+ return pot;
}
-}
+}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/PotWaterEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/PotWaterEvent.java
deleted file mode 100644
index da6e191..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/event/PotWaterEvent.java
+++ /dev/null
@@ -1,104 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.event;
-
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * An event that triggered when watering a pot
- */
-public class PotWaterEvent extends PlayerEvent implements Cancellable {
-
- private static final HandlerList handlers = new HandlerList();
- private boolean cancelled;
- private final ItemStack itemInHand;
- private int water;
- private final Location location;
-
- public PotWaterEvent(
- @NotNull Player who,
- @NotNull ItemStack itemInHand,
- int water,
- @NotNull Location location) {
- super(who);
- this.itemInHand = itemInHand;
- this.water = water;
- this.location = location;
- }
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- @NotNull
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- @NotNull
- @Override
- public HandlerList getHandlers() {
- return getHandlerList();
- }
-
- /**
- * Get the pot location
- * @return location
- */
- @NotNull
- public Location getLocation() {
- return location;
- }
-
- /**
- * Get the item in player's hand
- * @return item in hand
- */
- @NotNull
- public ItemStack getItemInHand() {
- return itemInHand;
- }
-
- /**
- * Get the amount of water
- * @return the amount of water that added to the pot
- */
- public int getWater() {
- return water;
- }
-
- /**
- * Set the amount of water that added to the pot
- * @param water water
- */
- public void setWater(int water) {
- this.water = water;
- }
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/SeasonChangeEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/SeasonChangeEvent.java
index c421e1a..dfc4641 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/SeasonChangeEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/SeasonChangeEvent.java
@@ -17,25 +17,27 @@
package net.momirealms.customcrops.api.event;
-import net.momirealms.customcrops.api.object.CCWorldSeason;
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
import org.bukkit.World;
+import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
-import org.bukkit.event.world.WorldEvent;
import org.jetbrains.annotations.NotNull;
/**
- * An event that triggered when season changes
+ * An async event triggered when season changes
*/
-public class SeasonChangeEvent extends WorldEvent {
+public class SeasonChangeEvent extends Event {
private static final HandlerList handlers = new HandlerList();
- private final CCWorldSeason season;
+ private final Season season;
+ private final World world;
public SeasonChangeEvent(
@NotNull World world,
- @NotNull CCWorldSeason season
+ @NotNull Season season
) {
- super(world);
+ super(true);
+ this.world = world;
this.season = season;
}
@@ -55,7 +57,15 @@ public class SeasonChangeEvent extends WorldEvent {
* @return season
*/
@NotNull
- public CCWorldSeason getSeason() {
+ public Season getSeason() {
return season;
}
+
+ /**
+ * Get the world
+ * @return world
+ */
+ public World getWorld() {
+ return world;
+ }
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerBreakEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerBreakEvent.java
index 36c3a89..a8bf779 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerBreakEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerBreakEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
- private final String sprinklerKey;
+ private final WorldSprinkler sprinkler;
public SprinklerBreakEvent(
@NotNull Player who,
@NotNull Location location,
- @NotNull String sprinklerKey
+ @NotNull WorldSprinkler sprinkler
) {
super(who);
this.location = location;
- this.sprinklerKey = sprinklerKey;
+ this.sprinkler = sprinkler;
}
@Override
@@ -75,11 +76,11 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the sprinkler config key
- * @return sprinkler key
+ * Get the sprinkler's data
+ * @return sprinkler
*/
@NotNull
- public String getSprinklerKey() {
- return sprinklerKey;
+ public WorldSprinkler getSprinkler() {
+ return sprinkler;
}
-}
+}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerFillEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerFillEvent.java
deleted file mode 100644
index 0474ce3..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerFillEvent.java
+++ /dev/null
@@ -1,116 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.event;
-
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.event.Cancellable;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.player.PlayerEvent;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-
-/**
- * An event that triggered when filling a sprinkler
- */
-public class SprinklerFillEvent extends PlayerEvent implements Cancellable {
-
- private static final HandlerList handlers = new HandlerList();
- private boolean cancelled;
- private final ItemStack itemInHand;
- private int water;
- private final Location location;
- private final String sprinklerKey;
-
- public SprinklerFillEvent(
- @NotNull Player who,
- @NotNull String sprinklerKey,
- @NotNull ItemStack itemInHand,
- int water,
- @NotNull Location location) {
- super(who);
- this.itemInHand = itemInHand;
- this.water = water;
- this.location = location;
- this.sprinklerKey = sprinklerKey;
- }
-
- @Override
- public boolean isCancelled() {
- return cancelled;
- }
-
- @Override
- public void setCancelled(boolean cancel) {
- this.cancelled = cancel;
- }
-
- @NotNull
- public static HandlerList getHandlerList() {
- return handlers;
- }
-
- @NotNull
- @Override
- public HandlerList getHandlers() {
- return getHandlerList();
- }
-
- /**
- * Get the item in player's hand
- * @return item in hand
- */
- @NotNull
- public ItemStack getItemInHand() {
- return itemInHand;
- }
-
- /**
- * Get the sprinkler location
- * @return location
- */
- @NotNull
- public Location getLocation() {
- return location;
- }
-
- /**
- * Get the amount of water
- * @return the amount of water that added to the sprinkler
- */
- public int getWater() {
- return water;
- }
-
- /**
- * Set the water that added to the sprinkler
- * @param water water
- */
- public void setWater(int water) {
- this.water = water;
- }
-
- /**
- * Get the sprinkler config key
- * @return sprinkler key
- */
- @NotNull
- public String getSprinklerKey() {
- return sprinklerKey;
- }
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerInteractEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerInteractEvent.java
index 346a531..f8ae29d 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerInteractEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerInteractEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -33,18 +34,18 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList();
private boolean cancelled;
private final Location location;
- private final String sprinklerKey;
+ private final WorldSprinkler sprinkler;
private final ItemStack itemInHand;
public SprinklerInteractEvent(
@NotNull Player who,
@NotNull ItemStack itemInHand,
@NotNull Location location,
- @NotNull String sprinklerKey
+ @NotNull WorldSprinkler sprinkler
) {
super(who);
this.location = location;
- this.sprinklerKey = sprinklerKey;
+ this.sprinkler = sprinkler;
this.itemInHand = itemInHand;
}
@@ -79,12 +80,12 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the sprinkler config key
- * @return sprinkler key
+ * Get the sprinkler's data
+ * @return sprinkler
*/
@NotNull
- public String getSprinklerKey() {
- return sprinklerKey;
+ public WorldSprinkler getSprinkler() {
+ return sprinkler;
}
/**
diff --git a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerPlaceEvent.java b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerPlaceEvent.java
index b50d252..547a3f6 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerPlaceEvent.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/event/SprinklerPlaceEvent.java
@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event;
+import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
@@ -34,13 +35,13 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
private boolean cancelled;
private final ItemStack itemInHand;
private final Location location;
- private final String sprinklerKey;
+ private final Sprinkler sprinkler;
- public SprinklerPlaceEvent(@NotNull Player who, ItemStack itemInHand, Location location, String sprinklerKey) {
+ public SprinklerPlaceEvent(@NotNull Player who, ItemStack itemInHand, Location location, Sprinkler sprinkler) {
super(who);
this.itemInHand = itemInHand;
this.location = location;
- this.sprinklerKey = sprinklerKey;
+ this.sprinkler = sprinkler;
}
@Override
@@ -83,11 +84,11 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
}
/**
- * Get the sprinkler config key
- * @return sprinkler key
+ * Get the sprinkler's config
+ * @return sprinkler
*/
@NotNull
- public String getSprinklerKey() {
- return sprinklerKey;
+ public Sprinkler getSprinkler() {
+ return sprinkler;
}
-}
+}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/integration/ItemInterface.java b/api/src/main/java/net/momirealms/customcrops/api/integration/ItemLibrary.java
similarity index 78%
rename from plugin/src/main/java/net/momirealms/customcrops/integration/ItemInterface.java
rename to api/src/main/java/net/momirealms/customcrops/api/integration/ItemLibrary.java
index 57ef3dd..0293d59 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/integration/ItemInterface.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/integration/ItemLibrary.java
@@ -15,14 +15,16 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.integration;
+package net.momirealms.customcrops.api.integration;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.Nullable;
-public interface ItemInterface {
+public interface ItemLibrary {
- @Nullable
- ItemStack build(String id, Player player);
+ String identification();
+
+ ItemStack buildItem(Player player, String id);
+
+ String getItemID(ItemStack itemStack);
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/integration/LevelInterface.java b/api/src/main/java/net/momirealms/customcrops/api/integration/LevelInterface.java
new file mode 100644
index 0000000..b347613
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/integration/LevelInterface.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.integration;
+
+import org.bukkit.entity.Player;
+
+public interface LevelInterface {
+
+ /**
+ * Add exp to a certain skill or job
+ *
+ * @param player player
+ * @param target the skill or job, for instance "Fishing" "fisherman"
+ * @param amount the exp amount
+ */
+ void addXp(Player player, String target, double amount);
+
+ /**
+ * Get a player's skill or job's level
+ *
+ * @param player player
+ * @param target the skill or job, for instance "Fishing" "fisherman"
+ * @return level
+ */
+ int getLevel(Player player, String target);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/integration/SeasonInterface.java b/api/src/main/java/net/momirealms/customcrops/api/integration/SeasonInterface.java
new file mode 100644
index 0000000..10c4df5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/integration/SeasonInterface.java
@@ -0,0 +1,41 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.integration;
+
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
+import org.bukkit.World;
+import org.jetbrains.annotations.Nullable;
+
+public interface SeasonInterface {
+
+ /**
+ * Get a world's season
+ *
+ * @param world world
+ * @return spring, summer, autumn, winter or null
+ */
+ @Nullable Season getSeason(World world);
+
+ /**
+ * Get a world's date
+ *
+ * @param world world
+ * @return date
+ */
+ int getDate(World world);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ActionManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ActionManager.java
new file mode 100644
index 0000000..2e94c26
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ActionManager.java
@@ -0,0 +1,48 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import net.momirealms.customcrops.api.mechanic.action.Action;
+import net.momirealms.customcrops.api.mechanic.action.ActionFactory;
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+import org.bukkit.configuration.ConfigurationSection;
+
+import java.util.HashMap;
+
+public interface ActionManager extends Reloadable {
+
+ boolean registerAction(String type, ActionFactory actionFactory);
+
+ boolean unregisterAction(String type);
+
+ Action getAction(ConfigurationSection section);
+
+ HashMap getActionMap(ConfigurationSection section);
+
+ Action[] getActions(ConfigurationSection section);
+
+ ActionFactory getActionFactory(String type);
+
+ static void triggerActions(State state, Action... actions) {
+ if (actions != null)
+ for (Action action : actions)
+ action.trigger(state);
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java
new file mode 100644
index 0000000..82348e4
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/AdventureManager.java
@@ -0,0 +1,61 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.kyori.adventure.key.Key;
+import net.kyori.adventure.sound.Sound;
+import net.kyori.adventure.text.Component;
+import net.momirealms.customcrops.api.common.Initable;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+
+public abstract class AdventureManager implements Initable {
+
+ private static AdventureManager instance;
+
+ public AdventureManager() {
+ instance = this;
+ }
+
+ public static AdventureManager getInstance() {
+ return instance;
+ }
+
+ public abstract void sendMessage(CommandSender sender, String s);
+
+ public abstract void sendMessageWithPrefix(CommandSender sender, String text);
+
+ public abstract void sendConsoleMessage(String text);
+
+ public abstract void sendPlayerMessage(Player player, String text);
+
+ public abstract void sendActionbar(Player player, String text);
+
+ public abstract void sendSound(Player player, Sound.Source source, Key key, float pitch, float volume);
+
+ public abstract void sendSound(Player player, Sound sound);
+
+ public abstract Component getComponentFromMiniMessage(String text);
+
+ public abstract String legacyToMiniMessage(String legacy);
+
+ @SuppressWarnings("BooleanMethodIsAlwaysInverted")
+ public abstract boolean isColorCode(char c);
+
+ public abstract void sendTitle(Player player, String title, String subTitle, int fadeIn, int stay, int fadeOut);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ConditionManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ConditionManager.java
new file mode 100644
index 0000000..adf3358
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ConditionManager.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import net.momirealms.customcrops.api.mechanic.condition.Condition;
+import net.momirealms.customcrops.api.mechanic.condition.ConditionFactory;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+import org.bukkit.configuration.ConfigurationSection;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface ConditionManager extends Reloadable {
+
+ boolean registerCondition(String type, ConditionFactory conditionFactory);
+
+ boolean unregisterCondition(String type);
+
+ boolean hasCondition(String type);
+
+ @NotNull
+ Condition[] getConditions(ConfigurationSection section);
+
+ Condition getCondition(ConfigurationSection section);
+
+ Condition getCondition(String key, Object args);
+
+ @Nullable ConditionFactory getConditionFactory(String type);
+
+ static boolean isConditionMet(CustomCropsBlock block, Condition... conditions) {
+ if (conditions == null) return true;
+ for (Condition condition : conditions) {
+ if (!condition.isConditionMet(block)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java
new file mode 100644
index 0000000..c730db4
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ConfigManager.java
@@ -0,0 +1,160 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import org.bukkit.World;
+
+public abstract class ConfigManager implements Reloadable {
+
+ private static ConfigManager instance;
+
+ public ConfigManager() {
+ instance = this;
+ }
+
+ public static ConfigManager getInstance() {
+ return instance;
+ }
+
+ public static boolean legacyColorSupport() {
+ return instance.hasLegacyColorSupport();
+ }
+
+ public static int maximumPoolSize() {
+ return instance.getMaximumPoolSize();
+ }
+
+ public static int corePoolSize() {
+ return instance.getCorePoolSize();
+ }
+
+ public static int keepAliveTime() {
+ return instance.getKeepAliveTime();
+ }
+
+ public static boolean debug() {
+ return instance.getDebugMode();
+ }
+
+ public static boolean protectLore() {
+ return instance.isProtectLore();
+ }
+
+ public static String[] itemDetectionOrder() {
+ return instance.getItemDetectionOrder();
+ }
+
+ public static String lang() {
+ return instance.getLang();
+ }
+
+ public static boolean metrics() {
+ return instance.hasMetrics();
+ }
+
+ public static boolean checkUpdate() {
+ return instance.hasCheckUpdate();
+ }
+
+ public static double[] defaultQualityRatio() {
+ return instance.getDefaultQualityRatio();
+ }
+
+ public static boolean preventTrampling() {
+ return instance.isPreventTrampling();
+ }
+
+ public static boolean disableMoisture() {
+ return instance.isDisableMoisture();
+ }
+
+ public static boolean syncSeasons() {
+ return instance.isSyncSeasons();
+ }
+
+ public static boolean enableGreenhouse() {
+ return instance.isGreenhouseEnabled();
+ }
+
+ public static World referenceWorld() {
+ return instance.getReferenceWorld();
+ }
+
+ public static int greenhouseRange() {
+ return instance.getGreenhouseRange();
+ }
+
+ public static int scarecrowRange() {
+ return instance.getScarecrowRange();
+ }
+
+ public static String greenhouseID() {
+ return instance.getGreenhouseID();
+ }
+
+ public static boolean enableScarecrow() {
+ return instance.isScarecrowEnabled();
+ }
+
+ public static String scarecrowID() {
+ return instance.getScarecrowID();
+ }
+
+ protected abstract double[] getDefaultQualityRatio();
+
+ protected abstract String getLang();
+
+ protected abstract boolean getDebugMode();
+
+ protected abstract boolean hasLegacyColorSupport();
+
+ protected abstract int getMaximumPoolSize();
+
+ protected abstract int getKeepAliveTime();
+
+ protected abstract int getCorePoolSize();
+
+ public abstract boolean isProtectLore();
+
+ public abstract String[] getItemDetectionOrder();
+
+ public abstract boolean hasMetrics();
+
+ public abstract boolean hasCheckUpdate();
+
+ public abstract boolean isDisableMoisture();
+
+ public abstract boolean isPreventTrampling();
+
+ public abstract boolean isGreenhouseEnabled();
+
+ public abstract String getGreenhouseID();
+
+ public abstract int getGreenhouseRange();
+
+ public abstract boolean isScarecrowEnabled();
+
+ public abstract String getScarecrowID();
+
+ public abstract int getScarecrowRange();
+
+ public abstract boolean isSyncSeasons();
+
+ public abstract World getReferenceWorld();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/CoolDownManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/CoolDownManager.java
new file mode 100644
index 0000000..92396f6
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/CoolDownManager.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.CustomCropsPlugin;
+import net.momirealms.customcrops.api.common.Reloadable;
+import org.bukkit.Bukkit;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.HandlerList;
+import org.bukkit.event.Listener;
+import org.bukkit.event.player.PlayerQuitEvent;
+
+import java.util.HashMap;
+import java.util.UUID;
+import java.util.concurrent.ConcurrentHashMap;
+
+public class CoolDownManager implements Listener, Reloadable {
+
+ private final ConcurrentHashMap dataMap;
+ private final CustomCropsPlugin plugin;
+
+ public CoolDownManager(CustomCropsPlugin plugin) {
+ this.dataMap = new ConcurrentHashMap<>();
+ this.plugin = plugin;
+ }
+
+ public boolean isCoolDown(UUID uuid, String key, long time) {
+ Data data = this.dataMap.computeIfAbsent(uuid, k -> new Data());
+ return data.isCoolDown(key, time);
+ }
+
+ @Override
+ public void load() {
+ Bukkit.getPluginManager().registerEvents(this, plugin);
+ }
+
+ @Override
+ public void unload() {
+ HandlerList.unregisterAll(this);
+ }
+
+ @Override
+ public void disable() {
+ unload();
+ this.dataMap.clear();
+ }
+
+ @EventHandler
+ public void onQuit(PlayerQuitEvent event) {
+ dataMap.remove(event.getPlayer().getUniqueId());
+ }
+
+ public static class Data {
+
+ private final HashMap coolDownMap;
+
+ public Data() {
+ this.coolDownMap = new HashMap<>();
+ }
+
+ public synchronized boolean isCoolDown(String key, long delay) {
+ long time = System.currentTimeMillis();
+ long last = coolDownMap.getOrDefault(key, time - delay);
+ if (last + delay > time) {
+ return true;
+ } else {
+ coolDownMap.put(key, time);
+ return false;
+ }
+ }
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/IntegrationManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/IntegrationManager.java
new file mode 100644
index 0000000..4f33ae5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/IntegrationManager.java
@@ -0,0 +1,62 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Initable;
+import net.momirealms.customcrops.api.integration.LevelInterface;
+import net.momirealms.customcrops.api.integration.SeasonInterface;
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
+import org.bukkit.World;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.Nullable;
+
+public interface IntegrationManager extends Initable {
+
+ /**
+ * Registers a level plugin with the specified name.
+ *
+ * @param plugin The name of the level plugin.
+ * @param level The implementation of the LevelInterface.
+ * @return true if the registration was successful, false if the plugin name is already registered.
+ */
+ boolean registerLevelPlugin(String plugin, LevelInterface level);
+
+ /**
+ * Unregisters a level plugin with the specified name.
+ *
+ * @param plugin The name of the level plugin to unregister.
+ * @return true if the unregistration was successful, false if the plugin name is not found.
+ */
+ boolean unregisterLevelPlugin(String plugin);
+
+ /**
+ * Get the LevelInterface provided by a plugin.
+ *
+ * @param plugin The name of the plugin providing the LevelInterface.
+ * @return The LevelInterface provided by the specified plugin, or null if the plugin is not registered.
+ */
+ @Nullable LevelInterface getLevelPlugin(String plugin);
+
+ SeasonInterface getSeasonInterface();
+
+ Season getSeason(World world);
+
+ int getDate(World world);
+
+ ItemStack build(String itemID);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java
new file mode 100644
index 0000000..95564aa
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/ItemManager.java
@@ -0,0 +1,113 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import net.momirealms.customcrops.api.integration.ItemLibrary;
+import net.momirealms.customcrops.api.mechanic.item.*;
+import org.bukkit.Location;
+import org.bukkit.block.Block;
+import org.bukkit.entity.Entity;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+
+public interface ItemManager extends Reloadable {
+
+ boolean registerItemLibrary(@NotNull ItemLibrary itemLibrary);
+
+ boolean unregisterItemLibrary(String identification);
+
+ String getItemID(ItemStack itemStack);
+
+ ItemStack getItemStack(Player player, String id);
+
+ void placeItem(Location location, ItemCarrier carrier, String id);
+
+ void removeAnythingAt(Location location);
+
+ @Nullable
+ WateringCan getWateringCanByID(@NotNull String id);
+
+ @Nullable
+ WateringCan getWateringCanByItemID(@NotNull String id);
+
+ @Nullable
+ WateringCan getWateringCanByItemStack(@NotNull ItemStack itemStack);
+
+ @Nullable
+ Sprinkler getSprinklerByID(@NotNull String id);
+
+ @Nullable
+ Sprinkler getSprinklerBy3DItemID(@NotNull String id);
+
+ @Nullable
+ Sprinkler getSprinklerBy2DItemID(@NotNull String id);
+
+ @Nullable
+ Sprinkler getSprinklerByEntity(@NotNull Entity entity);
+
+ @Nullable
+ Sprinkler getSprinklerBy2DItemStack(@NotNull ItemStack itemStack);
+
+ @Nullable
+ Sprinkler getSprinklerBy3DItemStack(@NotNull ItemStack itemStack);
+
+ @Nullable
+ Sprinkler getSprinklerByItemStack(@NotNull ItemStack itemStack);
+
+ @Nullable
+ Pot getPotByID(@NotNull String id);
+
+ @Nullable
+ Pot getPotByBlockID(@NotNull String id);
+
+ @Nullable
+ Pot getPotByBlock(@NotNull Block block);
+
+ @Nullable
+ Pot getPotByItemStack(@NotNull ItemStack itemStack);
+
+ Fertilizer getFertilizerByID(String id);
+
+ Fertilizer getFertilizerByItemID(String id);
+
+ Fertilizer getFertilizerByItemStack(@NotNull ItemStack itemStack);
+
+ Crop getCropByID(String id);
+
+ Crop getCropBySeedID(String id);
+
+ Crop getCropBySeedItemStack(ItemStack itemStack);
+
+ Crop getCropByStageID(String id);
+
+ Crop getCropByEntity(Entity entity);
+
+ Crop getCropByBlock(Block block);
+
+ Crop.Stage getCropStageByStageID(String id);
+
+ void updatePotState(Location location, Pot pot, boolean hasWater, Fertilizer fertilizer);
+
+ @NotNull
+ Collection getPotInRange(Location baseLocation, int width, int length, float yaw, String potID);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/MessageManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/MessageManager.java
new file mode 100644
index 0000000..7fc653b
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/MessageManager.java
@@ -0,0 +1,54 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
+import org.jetbrains.annotations.Nullable;
+
+public abstract class MessageManager {
+
+ private static MessageManager instance;
+
+ public MessageManager() {
+ instance = this;
+ }
+
+ public static MessageManager getInstance() {
+ return instance;
+ }
+
+ public static String seasonTranslation(@Nullable Season season) {
+ return instance.getSeasonTranslation(season);
+ }
+
+ public static String reloadMessage() {
+ return instance.getReload();
+ }
+
+ public static String prefix() {
+ return instance.getPrefix();
+ }
+
+ protected abstract String getPrefix();
+
+ protected abstract String getReload();
+
+ protected abstract String getSeasonTranslation(Season season);
+
+ public abstract void reload();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/PlaceholderManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/PlaceholderManager.java
new file mode 100644
index 0000000..a720b18
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/PlaceholderManager.java
@@ -0,0 +1,47 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import org.bukkit.entity.Player;
+
+import java.util.List;
+import java.util.Map;
+import java.util.regex.Pattern;
+
+public abstract class PlaceholderManager implements Reloadable {
+
+ public static final Pattern pattern = Pattern.compile("\\{[^{}]+}");
+ private static PlaceholderManager instance;
+
+ public PlaceholderManager() {
+ instance = this;
+ }
+
+ public static PlaceholderManager getInstance() {
+ return instance;
+ }
+
+ public abstract String parse(Player player, String text, Map vars);
+
+ public abstract List parse(Player player, List text, Map vars);
+
+ public abstract List detectPlaceholders(String text);
+
+ public abstract String setPlaceholders(Player player, String text);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/RequirementManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/RequirementManager.java
new file mode 100644
index 0000000..dc6eabe
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/RequirementManager.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.RequirementFactory;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+import org.bukkit.configuration.ConfigurationSection;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+
+public interface RequirementManager extends Reloadable {
+
+ boolean registerRequirement(String type, RequirementFactory requirementFactory);
+
+ boolean unregisterRequirement(String type);
+
+ @Nullable
+ Requirement[] getRequirements(ConfigurationSection section, boolean advanced);
+
+ boolean hasRequirement(String type);
+
+ @NotNull
+ Requirement getRequirement(ConfigurationSection section, boolean advanced);
+
+ @NotNull
+ Requirement getRequirement(String type, Object value);
+
+ @Nullable
+ RequirementFactory getRequirementFactory(String type);
+
+ static boolean isRequirementMet(State condition, Requirement... requirements) {
+ if (requirements == null) return true;
+ for (Requirement requirement : requirements) {
+ if (!requirement.isStateMet(condition)) {
+ return false;
+ }
+ }
+ return true;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java
new file mode 100644
index 0000000..9aa6a66
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/VersionManager.java
@@ -0,0 +1,77 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import java.util.concurrent.CompletionStage;
+
+public abstract class VersionManager {
+
+ private static VersionManager instance;
+
+ public VersionManager() {
+ instance = this;
+ }
+
+ public static VersionManager getInstance() {
+ return instance;
+ }
+
+ public static boolean isHigherThan1_19_R3() {
+ return instance.isVersionNewerThan1_19_R3();
+ }
+
+ public static boolean isHigherThan1_19_R2() {
+ return instance.isVersionNewerThan1_19_R2();
+ }
+
+ public abstract boolean hasRegionScheduler();
+
+ public static boolean folia() {
+ return instance.hasRegionScheduler();
+ }
+
+ public abstract String getPluginVersion();
+
+ public static String pluginVersion() {
+ return instance.getPluginVersion();
+ }
+
+ public static String serverVersion() {
+ return instance.getServerVersion();
+ }
+
+ public abstract String getServerVersion();
+
+ public static boolean spigot() {
+ return instance.isSpigot();
+ }
+
+ public abstract boolean isSpigot();
+
+ public abstract boolean isVersionNewerThan1_19_R3();
+
+ public abstract boolean isVersionNewerThan1_19();
+
+ public abstract boolean isVersionNewerThan1_19_R2();
+
+ public abstract boolean isVersionNewerThan1_20();
+
+ public abstract boolean isMojmap();
+
+ public abstract CompletionStage checkUpdate();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/manager/WorldManager.java b/api/src/main/java/net/momirealms/customcrops/api/manager/WorldManager.java
new file mode 100644
index 0000000..d354fea
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/manager/WorldManager.java
@@ -0,0 +1,142 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.manager;
+
+import net.momirealms.customcrops.api.common.Reloadable;
+import net.momirealms.customcrops.api.mechanic.item.*;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
+import net.momirealms.customcrops.api.mechanic.world.level.*;
+import org.bukkit.Chunk;
+import org.bukkit.World;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Collection;
+import java.util.Optional;
+
+public interface WorldManager extends Reloadable {
+
+ /**
+ * Load a specified world and convert it into a CustomCrops world
+ * This method ignores the whitelist and blacklist
+ * If there already exists one, it would not create a new instance but return the created one
+ *
+ * @param world world
+ */
+ @NotNull
+ CustomCropsWorld loadWorld(@NotNull World world);
+
+ /**
+ * Unload a specified world and save it to file
+ * This method ignores the whitelist and blacklist
+ *
+ * @param world world
+ */
+ boolean unloadWorld(@NotNull World world);
+
+ /**
+ * Check if the world has CustomCrops mechanisms
+ *
+ * @param world world
+ * @return has or not
+ */
+ boolean isMechanicEnabled(@NotNull World world);
+
+ /**
+ * Get all the worlds loaded in CustomCrops
+ *
+ * @return worlds
+ */
+ @NotNull
+ Collection getWorldNames();
+
+ /**
+ * Get all the worlds loaded in CustomCrops
+ *
+ * @return worlds
+ */
+ @NotNull
+ Collection getBukkitWorlds();
+
+ /**
+ * Get all the worlds loaded in CustomCrops
+ *
+ * @return worlds
+ */
+ @NotNull
+ Collection extends CustomCropsWorld> getCustomCropsWorlds();
+
+ @NotNull
+ Optional getCustomCropsWorld(@NotNull String name);
+
+ @NotNull
+ Optional getCustomCropsWorld(@NotNull World world);
+
+ @NotNull
+ Optional getSprinklerAt(@NotNull SimpleLocation location);
+
+ @NotNull
+ Optional getPotAt(@NotNull SimpleLocation location);
+
+ @NotNull
+ Optional getCropAt(@NotNull SimpleLocation location);
+
+ @NotNull Optional getGlassAt(@NotNull SimpleLocation location);
+
+ @NotNull Optional getScarecrowAt(@NotNull SimpleLocation location);
+
+ Optional getBlockAt(SimpleLocation location);
+
+ void addWaterToSprinkler(@NotNull Sprinkler sprinkler, @NotNull SimpleLocation location, int amount);
+
+ void addFertilizerToPot(@NotNull Pot pot, @NotNull Fertilizer fertilizer, @NotNull SimpleLocation location);
+
+ void addWaterToPot(@NotNull Pot pot, @NotNull SimpleLocation location, int amount);
+
+ void addGlassAt(@NotNull WorldGlass glass, @NotNull SimpleLocation location);
+
+ void addScarecrowAt(@NotNull WorldScarecrow scarecrow, @NotNull SimpleLocation location);
+
+ void removeSprinklerAt(@NotNull SimpleLocation location);
+
+ void removePotAt(@NotNull SimpleLocation location);
+
+ void removeCropAt(@NotNull SimpleLocation location);
+
+ boolean isReachLimit(SimpleLocation location, ItemType itemType);
+
+ void addPotAt(@NotNull WorldPot pot, @NotNull SimpleLocation location);
+
+ void addSprinklerAt(@NotNull WorldSprinkler sprinkler, @NotNull SimpleLocation location);
+
+ void addCropAt(@NotNull WorldCrop crop, @NotNull SimpleLocation location);
+
+ void addPointToCrop(@NotNull Crop crop, @NotNull SimpleLocation location, int points);
+
+ void handleChunkLoad(Chunk bukkitChunk);
+
+ void handleChunkUnload(Chunk bukkitChunk);
+
+ void saveChunkToFile(CustomCropsChunk chunk);
+
+ void removeGlassAt(@NotNull SimpleLocation location);
+
+ void removeScarecrowAt(@NotNull SimpleLocation location);
+
+ CustomCropsBlock removeAnythingAt(SimpleLocation location);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/Action.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/Action.java
new file mode 100644
index 0000000..860b7b5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/Action.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.action;
+
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+
+public interface Action {
+
+ void trigger(State condition);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionExpansion.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionExpansion.java
new file mode 100644
index 0000000..e349c7c
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionExpansion.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.action;
+
+public abstract class ActionExpansion {
+
+ public abstract String getVersion();
+
+ public abstract String getAuthor();
+
+ public abstract String getActionType();
+
+ public abstract ActionFactory getActionFactory();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionFactory.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionFactory.java
new file mode 100644
index 0000000..61fa136
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionFactory.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.action;
+
+public interface ActionFactory {
+
+ Action build(Object args, double chance);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionTrigger.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionTrigger.java
new file mode 100644
index 0000000..4ae87a6
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/action/ActionTrigger.java
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.action;
+
+public enum ActionTrigger {
+
+ BREAK,
+ PLACE,
+ GROW,
+ ADD_WATER,
+ NO_WATER,
+ CONSUME_WATER,
+ FULL,
+ WORK,
+ USE,
+ WRONG_POT,
+ WRONG_SPRINKLER,
+ BEFORE_PLANT,
+ REACH_LIMIT,
+ INTERACT, PLANT, RIPE,
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Condition.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Condition.java
similarity index 79%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Condition.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Condition.java
index 80ad9ab..8b7f1e8 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Condition.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Condition.java
@@ -15,11 +15,11 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.condition;
+package net.momirealms.customcrops.api.mechanic.condition;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface Condition {
- boolean isMet(SimpleLocation simpleLocation);
+ boolean isConditionMet(CustomCropsBlock block);
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionExpansion.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionExpansion.java
new file mode 100644
index 0000000..1f8691c
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionExpansion.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.condition;
+
+public abstract class ConditionExpansion {
+
+ public abstract String getVersion();
+
+ public abstract String getAuthor();
+
+ public abstract String getConditionType();
+
+ public abstract ConditionFactory getConditionFactory();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionFactory.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionFactory.java
new file mode 100644
index 0000000..bde4c2a
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/ConditionFactory.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.condition;
+
+public interface ConditionFactory {
+
+ Condition build(Object args);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Conditions.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Conditions.java
new file mode 100644
index 0000000..e0f7c9a
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/Conditions.java
@@ -0,0 +1,14 @@
+package net.momirealms.customcrops.api.mechanic.condition;
+
+public class Conditions {
+
+ private final Condition[] conditions;
+
+ public Conditions(Condition[] conditions) {
+ this.conditions = conditions;
+ }
+
+ public Condition[] getConditions() {
+ return conditions;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/DeathConditions.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/DeathConditions.java
new file mode 100644
index 0000000..501d2c0
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/condition/DeathConditions.java
@@ -0,0 +1,29 @@
+package net.momirealms.customcrops.api.mechanic.condition;
+
+import net.momirealms.customcrops.api.mechanic.item.ItemCarrier;
+
+public class DeathConditions extends Conditions {
+
+ private final String deathItem;
+ private final ItemCarrier itemCarrier;
+ private final int deathDelay;
+
+ public DeathConditions(Condition[] conditions, String deathItem, ItemCarrier itemCarrier, int deathDelay) {
+ super(conditions);
+ this.deathItem = deathItem;
+ this.itemCarrier = itemCarrier;
+ this.deathDelay = deathDelay;
+ }
+
+ public String getDeathItem() {
+ return deathItem;
+ }
+
+ public ItemCarrier getItemCarrier() {
+ return itemCarrier;
+ }
+
+ public int getDeathDelay() {
+ return deathDelay;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/BoneMeal.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/BoneMeal.java
new file mode 100644
index 0000000..2a988c2
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/BoneMeal.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.Pair;
+import net.momirealms.customcrops.api.manager.ActionManager;
+import net.momirealms.customcrops.api.mechanic.action.Action;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+
+import java.util.List;
+
+public class BoneMeal {
+
+ private final String item;
+ private final int usedAmount;
+ private final String returned;
+ private final int returnedAmount;
+ private final List> pointGainList;
+ private final Action[] actions;
+
+ public BoneMeal(String item, int usedAmount, String returned, int returnedAmount, List> pointGainList, Action[] actions) {
+ this.item = item;
+ this.returned = returned;
+ this.pointGainList = pointGainList;
+ this.actions = actions;
+ this.usedAmount = usedAmount;
+ this.returnedAmount = returnedAmount;
+ }
+
+ public String getItem() {
+ return item;
+ }
+
+ public String getReturned() {
+ return returned;
+ }
+
+ public int getPoint() {
+ for (Pair pair : pointGainList) {
+ if (Math.random() < pair.left()) {
+ return pair.right();
+ }
+ }
+ return 0;
+ }
+
+ public void trigger(State state) {
+ ActionManager.triggerActions(state, actions);
+ }
+
+ public int getUsedAmount() {
+ return usedAmount;
+ }
+
+ public int getReturnedAmount() {
+ return returnedAmount;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Crop.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Crop.java
new file mode 100644
index 0000000..6b846fb
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Crop.java
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.item.KeyItem;
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.condition.Conditions;
+import net.momirealms.customcrops.api.mechanic.condition.DeathConditions;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.HashSet;
+
+public interface Crop extends KeyItem {
+
+ String getSeedItemID();
+
+ int getMaxPoints();
+
+ Requirement[] getPlantRequirements();
+
+ Requirement[] getBreakRequirements();
+
+ Requirement[] getInteractRequirements();
+
+ Conditions getGrowConditions();
+
+ DeathConditions[] getDeathConditions();
+
+ BoneMeal[] getBoneMeals();
+
+ boolean isRotation();
+
+ void trigger(ActionTrigger trigger, State state);
+
+ Stage getStageByPoint(int point);
+
+ String getStageItemByPoint(int point);
+
+ Stage getStageByItemID(String itemID);
+
+ Collection extends Stage> getStages();
+
+ HashSet getPotWhitelist();
+
+ ItemCarrier getItemCarrier();
+
+ interface Stage {
+
+ double getHologramOffset();
+
+ @Nullable String getStageID();
+
+ int getPoint();
+
+ void trigger(ActionTrigger trigger, State state);
+
+ Requirement[] getInteractRequirements();
+
+ Requirement[] getBreakRequirements();
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/object/CCGrowingCrop.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Fertilizer.java
similarity index 59%
rename from api/src/main/java/net/momirealms/customcrops/api/object/CCGrowingCrop.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Fertilizer.java
index 2f43ebd..3e44779 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/object/CCGrowingCrop.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Fertilizer.java
@@ -15,28 +15,27 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.item;
-/**
- * Crops
- */
-public interface CCGrowingCrop {
+import net.momirealms.customcrops.api.common.item.EventItem;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
- /**
- * Get the crop growing point
- * @return point
- */
- int getPoints();
+import java.util.HashSet;
- /**
- * Set the growing point
- * @param points points
- */
- void setPoints(int points);
-
- /**
- * Get the crop config key
- * @return crop key
- */
+public interface Fertilizer extends EventItem {
String getKey();
+
+ String getItemID();
+
+ int getTimes();
+
+ FertilizerType getFertilizerType();
+
+ HashSet getPotWhitelist();
+
+ boolean isBeforePlant();
+
+ String getIcon();
+
+ Requirement[] getRequirements();
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerType.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/FertilizerType.java
similarity index 93%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerType.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/FertilizerType.java
index f83d472..2e6898c 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerType.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/FertilizerType.java
@@ -15,7 +15,7 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.fertilizer;
+package net.momirealms.customcrops.api.mechanic.item;
public enum FertilizerType {
SPEED_GROW,
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/ItemMode.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemCarrier.java
similarity index 81%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/ItemMode.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemCarrier.java
index 2f29bdd..449d710 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/ItemMode.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemCarrier.java
@@ -15,16 +15,13 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.item;
-import java.io.Serializable;
-
-public enum ItemMode implements Serializable {
-
- ARMOR_STAND,
+public enum ItemCarrier {
+ NOTE_BLOCK,
+ MUSHROOM,
+ CHORUS,
TRIPWIRE,
ITEM_FRAME,
- ITEM_DISPLAY,
- NOTE_BLOCK,
- CHORUS
+ ITEM_DISPLAY
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/ItemType.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemType.java
similarity index 87%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/ItemType.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemType.java
index a0e1d65..b28b3e8 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/ItemType.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/ItemType.java
@@ -15,15 +15,12 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.item;
public enum ItemType {
-
- GLASS,
- POT,
CROP,
+ POT,
SPRINKLER,
- SCARECROW,
- WATERING_CAN,
- UNKNOWN
+ GREENHOUSE,
+ SCARECROW
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Pot.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Pot.java
new file mode 100644
index 0000000..3a865ed
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Pot.java
@@ -0,0 +1,57 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.item.KeyItem;
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod;
+import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+
+import java.util.HashSet;
+
+public interface Pot extends KeyItem {
+
+ int getStorage();
+
+ String getKey();
+
+ HashSet getPotBlocks();
+
+ PassiveFillMethod[] getPassiveFillMethods();
+
+ String getDryItem();
+
+ String getWetItem();
+
+ Requirement[] getPlaceRequirements();
+
+ Requirement[] getBreakRequirements();
+
+ Requirement[] getUseRequirements();
+
+ void trigger(ActionTrigger trigger, State state);
+
+ WaterBar getWaterBar();
+
+ boolean isRainDropAccepted();
+ boolean isNearbyWaterAccepted();
+
+ String getBlockState(boolean water, FertilizerType type);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Scarecrow.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Scarecrow.java
new file mode 100644
index 0000000..cc4d33f
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Scarecrow.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.item.KeyItem;
+
+public interface Scarecrow extends KeyItem {
+
+ String getItemID();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Sprinkler.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Sprinkler.java
new file mode 100644
index 0000000..addf6d5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/Sprinkler.java
@@ -0,0 +1,60 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.item.KeyItem;
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.item.water.PassiveFillMethod;
+import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+
+import java.util.HashSet;
+
+public interface Sprinkler extends KeyItem {
+
+ String get2DItemID();
+
+ String get3DItemID();
+
+ String get3DItemWithWater();
+
+ int getStorage();
+
+ int getRange();
+
+ boolean isInfinite();
+
+ int getWater();
+
+ HashSet getPotWhitelist();
+
+ ItemCarrier getItemCarrier();
+
+ PassiveFillMethod[] getPassiveFillMethods();
+
+ Requirement[] getPlaceRequirements();
+
+ Requirement[] getBreakRequirements();
+
+ Requirement[] getUseRequirements();
+
+ void trigger(ActionTrigger trigger, State state);
+
+ WaterBar getWaterBar();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/WateringCan.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/WateringCan.java
new file mode 100644
index 0000000..645eda5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/WateringCan.java
@@ -0,0 +1,64 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item;
+
+import net.momirealms.customcrops.api.common.item.KeyItem;
+import net.momirealms.customcrops.api.mechanic.action.ActionTrigger;
+import net.momirealms.customcrops.api.mechanic.misc.image.WaterBar;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+
+public interface WateringCan extends KeyItem {
+
+ String getItemID();
+
+ int getWidth();
+
+ int getLength();
+
+ int getStorage();
+
+ int getWater();
+
+ boolean hasDynamicLore();
+
+ void updateItem(Player player, ItemStack itemStack, int water, Map args);
+
+ int getCurrentWater(ItemStack itemStack);
+
+ HashSet getPotWhitelist();
+
+ HashSet getSprinklerWhitelist();
+
+ List getLore();
+
+ @Nullable WaterBar getWaterBar();
+
+ Requirement[] getRequirements();
+
+ boolean isInfinite();
+
+ void trigger(ActionTrigger trigger, State state);
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/integration/SeasonInterface.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/QualityCrop.java
similarity index 75%
rename from plugin/src/main/java/net/momirealms/customcrops/integration/SeasonInterface.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/QualityCrop.java
index d066934..d50b9b0 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/integration/SeasonInterface.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/QualityCrop.java
@@ -15,13 +15,12 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.integration;
+package net.momirealms.customcrops.api.mechanic.item.fertilizer;
-import net.momirealms.customcrops.api.object.season.CCSeason;
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
-public interface SeasonInterface {
+public interface QualityCrop extends Fertilizer {
+ double getChance();
- CCSeason getSeason(String world);
-
- int getDate(String world);
+ double[] getRatio();
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/Function.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SoilRetain.java
similarity index 77%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/Function.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SoilRetain.java
index 386b32c..aa01a20 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/Function.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SoilRetain.java
@@ -15,23 +15,11 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.item.fertilizer;
-public class Function {
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
- public void init() {
+public interface SoilRetain extends Fertilizer {
- }
-
- public void load() {
-
- }
-
- public void unload() {
-
- }
-
- public void disable() {
-
- }
+ double getChance();
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SpeedGrow.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SpeedGrow.java
new file mode 100644
index 0000000..23c0ec2
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/SpeedGrow.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item.fertilizer;
+
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+
+public interface SpeedGrow extends Fertilizer {
+
+ int getPointBonus();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/Variation.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/Variation.java
new file mode 100644
index 0000000..727c62d
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/Variation.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item.fertilizer;
+
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+
+public interface Variation extends Fertilizer {
+
+ double getChanceBonus();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/YieldIncrease.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/YieldIncrease.java
new file mode 100644
index 0000000..cae5804
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/fertilizer/YieldIncrease.java
@@ -0,0 +1,25 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.item.fertilizer;
+
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+
+public interface YieldIncrease extends Fertilizer {
+
+ int getAmountBonus();
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/AbstractFillMethod.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/AbstractFillMethod.java
similarity index 50%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/fill/AbstractFillMethod.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/AbstractFillMethod.java
index f48b8ef..381a3c6 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/AbstractFillMethod.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/AbstractFillMethod.java
@@ -15,35 +15,35 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.fill;
+package net.momirealms.customcrops.api.mechanic.item.water;
-import net.kyori.adventure.sound.Sound;
-import org.bukkit.Particle;
-import org.jetbrains.annotations.Nullable;
+import net.momirealms.customcrops.api.manager.ActionManager;
+import net.momirealms.customcrops.api.manager.RequirementManager;
+import net.momirealms.customcrops.api.mechanic.action.Action;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
+import net.momirealms.customcrops.api.mechanic.requirement.State;
public abstract class AbstractFillMethod {
protected int amount;
- protected Particle particle;
- protected Sound sound;
+ private final Action[] actions;
+ private final Requirement[] requirements;
- protected AbstractFillMethod(int amount, Particle particle, Sound sound) {
+ protected AbstractFillMethod(int amount, Action[] actions, Requirement[] requirements) {
this.amount = amount;
- this.particle = particle;
- this.sound = sound;
+ this.actions = actions;
+ this.requirements = requirements;
}
public int getAmount() {
return amount;
}
- @Nullable
- public Particle getParticle() {
- return particle;
+ public void trigger(State state) {
+ ActionManager.triggerActions(state, actions);
}
-
- public Sound getSound() {
- return sound;
+ public boolean canFill(State state) {
+ return RequirementManager.isRequirementMet(state, requirements);
}
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PassiveFillMethod.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PassiveFillMethod.java
similarity index 53%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PassiveFillMethod.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PassiveFillMethod.java
index 5a636aa..54f4c44 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PassiveFillMethod.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PassiveFillMethod.java
@@ -15,32 +15,40 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.fill;
+package net.momirealms.customcrops.api.mechanic.item.water;
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.CustomCrops;
-import org.bukkit.Particle;
-import org.bukkit.inventory.ItemStack;
+import net.momirealms.customcrops.api.mechanic.action.Action;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import org.jetbrains.annotations.Nullable;
public class PassiveFillMethod extends AbstractFillMethod {
private final String used;
+ private final int usedAmount;
private final String returned;
+ private final int returnedAmount;
- public PassiveFillMethod(String used, @Nullable String returned, int amount, @Nullable Particle particle, @Nullable Sound sound) {
- super(amount, particle, sound);
+ public PassiveFillMethod(String used, int usedAmount, @Nullable String returned, int returnedAmount, int amount, Action[] actions, Requirement[] requirements) {
+ super(amount, actions, requirements);
this.used = used;
this.returned = returned;
+ this.usedAmount = usedAmount;
+ this.returnedAmount = returnedAmount;
}
- public boolean isRightItem(String item_id) {
- return used.equals(item_id);
+ public String getUsed() {
+ return used;
}
- @Nullable
- public ItemStack getReturnedItemStack() {
- if (returned == null) return null;
- return CustomCrops.getInstance().getIntegrationManager().build(returned);
+ public String getReturned() {
+ return returned;
+ }
+
+ public int getUsedAmount() {
+ return usedAmount;
+ }
+
+ public int getReturnedAmount() {
+ return returnedAmount;
}
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PositiveFillMethod.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PositiveFillMethod.java
similarity index 71%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PositiveFillMethod.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PositiveFillMethod.java
index 551d263..8d91b8f 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fill/PositiveFillMethod.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/item/water/PositiveFillMethod.java
@@ -15,17 +15,17 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.fill;
+package net.momirealms.customcrops.api.mechanic.item.water;
-import net.kyori.adventure.sound.Sound;
-import org.bukkit.Particle;
+import net.momirealms.customcrops.api.mechanic.action.Action;
+import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
public class PositiveFillMethod extends AbstractFillMethod {
private final String id;
- public PositiveFillMethod(String id, int amount, Particle particle, Sound sound) {
- super(amount, particle, sound);
+ public PositiveFillMethod(String id, int amount, Action[] actions, Requirement[] requirements) {
+ super(amount, actions, requirements);
this.id = id;
}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/papi/PapiRequirement.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/Value.java
similarity index 84%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/papi/PapiRequirement.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/Value.java
index 1aa9df0..503ba16 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/papi/PapiRequirement.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/Value.java
@@ -15,10 +15,11 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.requirement.papi;
+package net.momirealms.customcrops.api.mechanic.misc;
import org.bukkit.entity.Player;
-public interface PapiRequirement {
- boolean isMet(Player player);
+public interface Value {
+
+ double get(Player player);
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/image/WaterBar.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/image/WaterBar.java
new file mode 100644
index 0000000..0cbe359
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/misc/image/WaterBar.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.misc.image;
+
+public record WaterBar(String left, String empty, String full, String right) {
+
+ public static WaterBar of(String left, String empty, String full, String right) {
+ return new WaterBar(left, empty, full, right);
+ }
+
+ public String getWaterBar(int current, int max) {
+ return left +
+ String.valueOf(full).repeat(current) +
+ String.valueOf(empty).repeat(Math.max(max - current, 0)) +
+ right;
+ }
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/Requirement.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/Requirement.java
similarity index 86%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/Requirement.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/Requirement.java
index a2d177f..e708478 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/requirement/Requirement.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/Requirement.java
@@ -15,9 +15,9 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.requirement;
+package net.momirealms.customcrops.api.mechanic.requirement;
public interface Requirement {
- boolean isConditionMet(CurrentState currentState);
+ boolean isStateMet(State state);
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementExpansion.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementExpansion.java
new file mode 100644
index 0000000..9f9972f
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementExpansion.java
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.requirement;
+
+public abstract class RequirementExpansion {
+
+ public abstract String getVersion();
+
+ public abstract String getAuthor();
+
+ public abstract String getRequirementType();
+
+ public abstract RequirementFactory getRequirementFactory();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementFactory.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementFactory.java
new file mode 100644
index 0000000..cf429ec
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/RequirementFactory.java
@@ -0,0 +1,31 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.requirement;
+
+import net.momirealms.customcrops.api.mechanic.action.Action;
+
+import java.util.List;
+
+public interface RequirementFactory {
+
+ Requirement build(Object args, List notMetActions, boolean advanced);
+
+ default Requirement build(Object args) {
+ return build(args, null, false);
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/State.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/State.java
new file mode 100644
index 0000000..cbb0dd6
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/requirement/State.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.requirement;
+
+import org.bukkit.Location;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.HashMap;
+import java.util.Map;
+
+public class State {
+
+ private final Player player;
+ private final ItemStack itemInHand;
+ private final Location location;
+ private final HashMap args;
+
+ public State(Player player, ItemStack itemInHand, @NotNull Location location) {
+ this.player = player;
+ this.itemInHand = itemInHand;
+ this.location = location.toBlockLocation();
+ this.args = new HashMap<>();
+ if (player != null) {
+ setArg("{player}", player.getName());
+ }
+ setArg("{x}", String.valueOf(location.getBlockX()));
+ setArg("{y}", String.valueOf(location.getBlockY()));
+ setArg("{z}", String.valueOf(location.getBlockZ()));
+ }
+
+ public Player getPlayer() {
+ return player;
+ }
+
+ public ItemStack getItemInHand() {
+ return itemInHand;
+ }
+
+ public Location getLocation() {
+ return location;
+ }
+
+ public Map getArgs() {
+ return args;
+ }
+
+ public void setArg(String key, String value) {
+ args.put(key, value);
+ }
+
+ public String getArg(String key) {
+ return args.get(key);
+ }
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/world/ChunkCoordinate.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkCoordinate.java
similarity index 63%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/world/ChunkCoordinate.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkCoordinate.java
index c6295a5..81e93c6 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/world/ChunkCoordinate.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkCoordinate.java
@@ -15,34 +15,17 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.world;
+package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Chunk;
import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import java.io.Serializable;
+public record ChunkCoordinate(int x, int z) {
-public class ChunkCoordinate implements Serializable {
+ private static final ChunkCoordinate empty = new ChunkCoordinate(0, 0);
- private final int x;
- private final int z;
-
- public ChunkCoordinate(int x, int z) {
- this.x = x;
- this.z = z;
- }
-
- public int getX() {
- return x;
- }
-
- public int getZ() {
- return z;
- }
-
- public String getFileName() {
- return x + "," + z;
+ public static ChunkCoordinate of(int x, int z) {
+ return new ChunkCoordinate(x, z);
}
@Override
@@ -69,21 +52,16 @@ public class ChunkCoordinate implements Serializable {
return true;
}
- @Nullable
- public static ChunkCoordinate getByString(@NotNull String str) {
- String[] split = str.split(",", 2);
- try {
- int x = Integer.parseInt(split[0]);
- int z = Integer.parseInt(split[1]);
- return new ChunkCoordinate(x, z);
- }
- catch (NumberFormatException e) {
- return null;
- }
- }
-
@NotNull
public static ChunkCoordinate getByBukkitChunk(@NotNull Chunk chunk) {
return new ChunkCoordinate(chunk.getX(), chunk.getZ());
}
+
+ @Override
+ public String toString() {
+ return "ChunkCoordinate{" +
+ "x=" + x +
+ ", z=" + z +
+ '}';
+ }
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkPos.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkPos.java
new file mode 100644
index 0000000..aca71ca
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/ChunkPos.java
@@ -0,0 +1,87 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world;
+
+import java.util.Objects;
+
+public class ChunkPos {
+
+ private final int position;
+
+ public ChunkPos(int position) {
+ this.position = position;
+ }
+
+ public ChunkPos(int x, int y, int z) {
+ this.position = ((x & 0xF) << 28) | ((z & 0xF) << 24) | (y & 0xFFFFFF);
+ }
+
+ public static ChunkPos getByLocation(SimpleLocation location) {
+ return new ChunkPos(location.getX() % 16, location.getY(), location.getZ() % 16);
+ }
+
+ public SimpleLocation getLocation(String world, ChunkCoordinate coordinate) {
+ return new SimpleLocation(world, coordinate.x() * 16 + getX(), getY(), coordinate.z() * 16 + getZ());
+ }
+
+ public int getPosition() {
+ return position;
+ }
+
+ public int getX() {
+ return (position >> 28) & 0xF;
+ }
+
+ public int getZ() {
+ return (position >> 24) & 0xF;
+ }
+
+ public int getSectionID() {
+ return getY() / 16;
+ }
+
+ public int getY() {
+ int y = position & 0xFFFFFF;
+ if ((y & 0x800000) != 0) {
+ y |= 0xFF000000;
+ }
+ return y;
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ ChunkPos chunkPos = (ChunkPos) o;
+ return position == chunkPos.position;
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(position);
+ }
+
+ @Override
+ public String toString() {
+ return "ChunkPos{" +
+ "x=" + getX() +
+ "y=" + getY() +
+ "z=" + getZ() +
+ '}';
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/CustomCropsBlock.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/CustomCropsBlock.java
new file mode 100644
index 0000000..2f2fa6f
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/CustomCropsBlock.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world;
+
+import net.momirealms.customcrops.api.mechanic.item.ItemType;
+import net.momirealms.customcrops.api.mechanic.world.level.DataBlock;
+
+public interface CustomCropsBlock extends DataBlock, Tickable {
+
+ ItemType getType();
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/world/SimpleLocation.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java
similarity index 70%
rename from plugin/src/main/java/net/momirealms/customcrops/api/object/world/SimpleLocation.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java
index 7fd959b..a83ae58 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/world/SimpleLocation.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SimpleLocation.java
@@ -15,26 +15,24 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object.world;
+package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Bukkit;
import org.bukkit.Location;
import org.bukkit.World;
import org.jetbrains.annotations.Nullable;
-import java.io.Serial;
-import java.io.Serializable;
import java.util.Objects;
-public class SimpleLocation implements Serializable {
+public class SimpleLocation {
- @Serial
- private static final long serialVersionUID = -1288860694388882412L;
+ private int x;
+ private int y;
+ private int z;
+ private String worldName;
- private final int x;
- private final int y;
- private final int z;
- private final String worldName;
+ private SimpleLocation() {
+ }
public SimpleLocation(String worldName, int x, int y, int z){
this.worldName = worldName;
@@ -64,7 +62,10 @@ public class SimpleLocation implements Serializable {
}
public SimpleLocation add(int x, int y, int z) {
- return new SimpleLocation(worldName, this.x + x, this.y + y, this.z + z);
+ this.x += x;
+ this.y += y;
+ this.z += z;
+ return this;
}
@Override
@@ -79,13 +80,13 @@ public class SimpleLocation implements Serializable {
if (!Objects.equals(worldName, other.getWorldName())) {
return false;
}
- if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x)) {
+ if (this.x != other.x) {
return false;
}
- if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y)) {
+ if (this.y != other.y) {
return false;
}
- if (Double.doubleToLongBits(this.z) != Double.doubleToLongBits(other.z)) {
+ if (this.z != other.z) {
return false;
}
return true;
@@ -94,9 +95,8 @@ public class SimpleLocation implements Serializable {
@Override
public int hashCode() {
int hash = 3;
- //hash = 19 * hash + (worldName != null ? worldName.hashCode() : 0);
- hash = 19 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
- hash = 19 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
+ hash = 7 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
+ hash = 13 * hash + (int) (Double.doubleToLongBits(this.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
hash = 19 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
return hash;
}
@@ -113,18 +113,23 @@ public class SimpleLocation implements Serializable {
return Bukkit.getWorld(worldName);
}
- public static SimpleLocation getByString(String location, String world) {
- String[] loc = location.split(",");
- return new SimpleLocation(world, Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2]));
+ public static SimpleLocation getByString(String location) {
+ String[] loc = location.split(",", 4);
+ return new SimpleLocation(loc[0], Integer.parseInt(loc[1]), Integer.parseInt(loc[2]), Integer.parseInt(loc[3]));
}
- public static SimpleLocation getByBukkitLocation(Location location) {
+ public static SimpleLocation of(Location location) {
return new SimpleLocation(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ());
}
@Override
public String toString() {
- return "[" + worldName + "," + x + "," + y + "," + z + "]";
+ return "SimpleLocation{" +
+ "x=" + x +
+ ", y=" + y +
+ ", z=" + z +
+ ", worldName='" + worldName + '\'' +
+ '}';
}
public boolean isNear(SimpleLocation simpleLocation, int distance) {
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SynchronizedCompoundMap.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SynchronizedCompoundMap.java
new file mode 100644
index 0000000..c6f24eb
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/SynchronizedCompoundMap.java
@@ -0,0 +1,67 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world;
+
+import com.flowpowered.nbt.CompoundMap;
+import com.flowpowered.nbt.Tag;
+
+import java.util.Objects;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+public class SynchronizedCompoundMap {
+
+ private final CompoundMap compoundMap;
+ private final ReadWriteLock rwLock = new ReentrantReadWriteLock();
+ private final java.util.concurrent.locks.Lock readLock = rwLock.readLock();
+ private final java.util.concurrent.locks.Lock writeLock = rwLock.writeLock();
+
+ public SynchronizedCompoundMap(CompoundMap compoundMap) {
+ this.compoundMap = compoundMap;
+ }
+
+ public CompoundMap getOriginalMap() {
+ return compoundMap;
+ }
+
+ public Tag> get(String key) {
+ readLock.lock();
+ try {
+ return compoundMap.get(key);
+ } finally {
+ readLock.unlock();
+ }
+ }
+
+ public Tag> put(String key, Tag> tag) {
+ writeLock.lock();
+ try {
+ return compoundMap.put(key, tag);
+ } finally {
+ writeLock.unlock();
+ }
+ }
+
+ @Override
+ public boolean equals(Object o) {
+ if (this == o) return true;
+ if (o == null || getClass() != o.getClass()) return false;
+ SynchronizedCompoundMap that = (SynchronizedCompoundMap) o;
+ return Objects.equals(compoundMap, that.compoundMap);
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/Tickable.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/Tickable.java
new file mode 100644
index 0000000..047517b
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/Tickable.java
@@ -0,0 +1,6 @@
+package net.momirealms.customcrops.api.mechanic.world;
+
+public interface Tickable {
+
+ void tick(int interval);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/AbstractCustomCropsBlock.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/AbstractCustomCropsBlock.java
new file mode 100644
index 0000000..23ad475
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/AbstractCustomCropsBlock.java
@@ -0,0 +1,73 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import com.flowpowered.nbt.CompoundMap;
+import com.flowpowered.nbt.IntTag;
+import com.flowpowered.nbt.Tag;
+import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
+import net.momirealms.customcrops.api.mechanic.world.SynchronizedCompoundMap;
+
+public class AbstractCustomCropsBlock implements DataBlock {
+
+ private final SimpleLocation location;
+ private final SynchronizedCompoundMap compoundMap;
+
+ public AbstractCustomCropsBlock(SimpleLocation location, CompoundMap compoundMap) {
+ this.compoundMap = new SynchronizedCompoundMap(compoundMap);
+ this.location = location;
+ }
+
+ @Override
+ public void setData(String key, Tag> tag) {
+ compoundMap.put(key, tag);
+ }
+
+ @Override
+ public Tag> getData(String name) {
+ return compoundMap.get(name);
+ }
+
+ @Override
+ public SynchronizedCompoundMap getCompoundMap() {
+ return compoundMap;
+ }
+
+ @Override
+ public SimpleLocation getLocation() {
+ return location;
+ }
+
+ public boolean canTick(int interval) {
+ if (interval == 1) {
+ return true;
+ }
+ Tag> tag = getData("tick");
+ int tick = 0;
+ if (tag != null) {
+ tick = tag.getAsIntTag().map(IntTag::getValue).orElse(0);
+ }
+ if (++tick >= interval) {
+ setData("tick", new IntTag("tick", 0));
+ return true;
+ } else {
+ setData("tick", new IntTag("tick", tick));
+ }
+ return false;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java
new file mode 100644
index 0000000..c3062fe
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java
@@ -0,0 +1,105 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import net.momirealms.customcrops.api.mechanic.item.Crop;
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+import net.momirealms.customcrops.api.mechanic.item.Pot;
+import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
+import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
+
+import java.util.Optional;
+
+public interface CustomCropsChunk {
+
+ void notifyOfflineUpdates();
+
+ CustomCropsWorld getCustomCropsWorld();
+
+ ChunkCoordinate getChunkCoordinate();
+
+ void secondTimer();
+
+ long getLastLoadedTime();
+
+ int getLoadedSeconds();
+
+ Optional getCropAt(SimpleLocation location);
+
+ Optional getSprinklerAt(SimpleLocation location);
+
+ Optional getPotAt(SimpleLocation location);
+
+ Optional getGlassAt(SimpleLocation location);
+
+ Optional getScarecrowAt(SimpleLocation location);
+
+ Optional getBlockAt(SimpleLocation location);
+
+ void addWaterToSprinkler(Sprinkler sprinkler, SimpleLocation location, int amount);
+
+ void addFertilizerToPot(Pot pot, Fertilizer fertilizer, SimpleLocation location);
+
+ void addWaterToPot(Pot pot, SimpleLocation location, int amount);
+
+ void removeSprinklerAt(SimpleLocation location);
+
+ void removePotAt(SimpleLocation location);
+
+ void removeCropAt(SimpleLocation location);
+
+ void removeGlassAt(SimpleLocation location);
+
+ void removeScarecrowAt(SimpleLocation location);
+
+ CustomCropsBlock removeBlockAt(SimpleLocation location);
+
+ CustomCropsBlock addBlockAt(CustomCropsBlock block, SimpleLocation location);
+
+ int getCropAmount();
+
+ int getPotAmount();
+
+ int getSprinklerAmount();
+
+ void addPotAt(WorldPot pot, SimpleLocation location);
+
+ void addSprinklerAt(WorldSprinkler sprinkler, SimpleLocation location);
+
+ void addCropAt(WorldCrop crop, SimpleLocation location);
+
+ void addPointToCrop(Crop crop, SimpleLocation location, int points);
+
+ void addGlassAt(WorldGlass glass, SimpleLocation location);
+
+ void addScarecrowAt(WorldScarecrow scarecrow, SimpleLocation location);
+
+ void updateLastLoadedTime();
+
+ CustomCropsSection[] getSections();
+
+ CustomCropsSection getSection(int sectionID);
+
+ int getUnloadedSeconds();
+
+ void setUnloadedSeconds(int unloadedSeconds);
+
+ boolean canPrune();
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/util/RotationUtils.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsSection.java
similarity index 55%
rename from plugin/src/main/java/net/momirealms/customcrops/util/RotationUtils.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsSection.java
index 534c311..c0b2f3f 100644
--- a/plugin/src/main/java/net/momirealms/customcrops/util/RotationUtils.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsSection.java
@@ -15,22 +15,26 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.util;
+package net.momirealms.customcrops.api.mechanic.world.level;
-import org.bukkit.Rotation;
+import net.momirealms.customcrops.api.mechanic.world.ChunkPos;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
-import java.util.Random;
+import java.util.Map;
-public class RotationUtils {
+public interface CustomCropsSection {
- private static final Rotation[] rotations4 = {Rotation.NONE, Rotation.FLIPPED, Rotation.CLOCKWISE, Rotation.COUNTER_CLOCKWISE};
- private static final float[] rotationsF = {0f, 90f, 180f, -90f};
+ int getSectionID();
- public static Rotation getRandomRotation() {
- return rotations4[new Random().nextInt(4)];
- }
+ CustomCropsBlock getBlockAt(ChunkPos pos);
- public static float getRandomFloatRotation() {
- return rotationsF[new Random().nextInt(4)];
- }
+ CustomCropsBlock removeBlockAt(ChunkPos pos);
+
+ CustomCropsBlock addBlockAt(ChunkPos pos, CustomCropsBlock block);
+
+ boolean canPrune();
+
+ CustomCropsBlock[] getBlocks();
+
+ Map getBlockMap();
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java
new file mode 100644
index 0000000..af2f960
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsWorld.java
@@ -0,0 +1,114 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import net.momirealms.customcrops.api.mechanic.item.Crop;
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+import net.momirealms.customcrops.api.mechanic.item.Pot;
+import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
+import net.momirealms.customcrops.api.mechanic.world.ChunkCoordinate;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
+import org.bukkit.World;
+import org.jetbrains.annotations.Nullable;
+
+import java.util.Collection;
+import java.util.Optional;
+
+public interface CustomCropsWorld {
+
+ void startTick();
+
+ void cancelTick();
+
+ CustomCropsChunk removeLazyChunkAt(ChunkCoordinate chunkCoordinate);
+
+ WorldSetting getWorldSetting();
+
+ void setWorldSetting(WorldSetting setting);
+
+ Collection extends CustomCropsChunk> getChunkStorage();
+
+ World getWorld();
+
+ String getWorldName();
+
+ boolean isChunkLoaded(ChunkCoordinate chunkCoordinate);
+
+ Optional getChunkAt(ChunkCoordinate chunkCoordinate);
+
+ void loadChunk(CustomCropsChunk chunk);
+
+ void unloadChunk(ChunkCoordinate chunkCoordinate);
+
+ void setInfoData(WorldInfoData infoData);
+
+ WorldInfoData getInfoData();
+
+ @Nullable
+ Season getSeason();
+
+ Optional getSprinklerAt(SimpleLocation location);
+
+ Optional getPotAt(SimpleLocation location);
+
+ Optional getCropAt(SimpleLocation location);
+
+ Optional getGlassAt(SimpleLocation location);
+
+ Optional getScarecrowAt(SimpleLocation location);
+
+ Optional getBlockAt(SimpleLocation location);
+
+ void addWaterToSprinkler(Sprinkler sprinkler, SimpleLocation location, int amount);
+
+ void addFertilizerToPot(Pot pot, Fertilizer fertilizer, SimpleLocation location);
+
+ void addWaterToPot(Pot pot, SimpleLocation location, int amount);
+
+ void removeSprinklerAt(SimpleLocation location);
+
+ void removePotAt(SimpleLocation location);
+
+ void removeCropAt(SimpleLocation location);
+
+ void removeGlassAt(SimpleLocation location);
+
+ void removeScarecrowAt(SimpleLocation location);
+
+ CustomCropsBlock removeAnythingAt(SimpleLocation location);
+
+ boolean isPotReachLimit(SimpleLocation location);
+
+ boolean isCropReachLimit(SimpleLocation location);
+
+ boolean isSprinklerReachLimit(SimpleLocation location);
+
+ void addPotAt(WorldPot pot, SimpleLocation location);
+
+ void addSprinklerAt(WorldSprinkler sprinkler, SimpleLocation location);
+
+ void addCropAt(WorldCrop crop, SimpleLocation location);
+
+ void addPointToCrop(Crop crop, SimpleLocation location, int points);
+
+ void addGlassAt(WorldGlass glass, SimpleLocation location);
+
+ void addScarecrowAt(WorldScarecrow scarecrow, SimpleLocation location);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/DataBlock.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/DataBlock.java
new file mode 100644
index 0000000..6f13675
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/DataBlock.java
@@ -0,0 +1,33 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import com.flowpowered.nbt.Tag;
+import net.momirealms.customcrops.api.mechanic.world.SimpleLocation;
+import net.momirealms.customcrops.api.mechanic.world.SynchronizedCompoundMap;
+
+public interface DataBlock {
+
+ void setData(String key, Tag> tag);
+
+ Tag> getData(String key);
+
+ SynchronizedCompoundMap getCompoundMap();
+
+ SimpleLocation getLocation();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldCrop.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldCrop.java
new file mode 100644
index 0000000..2667aa7
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldCrop.java
@@ -0,0 +1,32 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import net.momirealms.customcrops.api.mechanic.item.Crop;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+
+public interface WorldCrop extends CustomCropsBlock {
+
+ String getKey();
+
+ int getPoint();
+
+ void setPoint(int point);
+
+ Crop getConfig();
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldGlass.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldGlass.java
new file mode 100644
index 0000000..b4b74ce
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldGlass.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+
+public interface WorldGlass extends CustomCropsBlock {
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java
new file mode 100644
index 0000000..42cd793
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldInfoData.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import com.google.gson.annotations.SerializedName;
+import net.momirealms.customcrops.api.mechanic.world.season.Season;
+
+public class WorldInfoData {
+
+ @SerializedName("season")
+ private Season season;
+ @SerializedName("date")
+ private int date;
+
+ public WorldInfoData(Season season, int date) {
+ this.season = season;
+ this.date = date;
+ }
+
+ public static WorldInfoData empty() {
+ return new WorldInfoData(Season.SPRING, 1);
+ }
+
+ public Season getSeason() {
+ if (season == null) season = Season.SPRING;
+ return season;
+ }
+
+ public void setSeason(Season season) {
+ this.season = season;
+ }
+
+ public int getDate() {
+ return date;
+ }
+
+ public void setDate(int date) {
+ this.date = date;
+ }
+
+ @Override
+ public String toString() {
+ return "WorldInfoData{" +
+ "season=" + season +
+ ", date=" + date +
+ '}';
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/object/CCFertilizer.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldPot.java
similarity index 54%
rename from api/src/main/java/net/momirealms/customcrops/api/object/CCFertilizer.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldPot.java
index 8889ddd..2d35b6e 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/object/CCFertilizer.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldPot.java
@@ -15,34 +15,31 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.world.level;
-/**
- * Fertilizer
- */
-public interface CCFertilizer {
+import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
+import net.momirealms.customcrops.api.mechanic.item.Pot;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
- /**
- * Reduce the fertilizer's usage times
- * @return whether the fertilizer is used up
- */
- boolean reduceTimes();
+public interface WorldPot extends CustomCropsBlock {
- /**
- * Get the fertilizer key in config
- * @return key
- */
String getKey();
- /**
- * Get the remaining usage times
- * @return times
- */
- int getLeftTimes();
+ int getWater();
- /**
- * Set remaining usage times
- * @param times times
- */
- void setTimes(int times);
+ void setWater(int water);
+
+ Fertilizer getFertilizer();
+
+ void setFertilizer(Fertilizer fertilizer);
+
+ void removeFertilizer();
+
+ int getFertilizerTimes();
+
+ void setFertilizerTimes(int times);
+
+ Pot getConfig();
+
+ void tickWater(CustomCropsChunk chunk);
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldScarecrow.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldScarecrow.java
new file mode 100644
index 0000000..a6725af
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldScarecrow.java
@@ -0,0 +1,23 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+
+public interface WorldScarecrow extends CustomCropsBlock {
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSetting.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSetting.java
new file mode 100644
index 0000000..868b3b5
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSetting.java
@@ -0,0 +1,191 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.level;
+
+public class WorldSetting implements Cloneable {
+
+ private final boolean enableScheduler;
+ private final int minTickUnit;
+ private final int tickCropInterval;
+ private final int tickPotInterval;
+ private final int tickSprinklerInterval;
+ private final boolean offlineGrow;
+ private final boolean enableSeason;
+ private final boolean autoSeasonChange;
+ private final int seasonDuration;
+ private final int cropPerChunk;
+ private final int potPerChunk;
+ private final int sprinklerPerChunk;
+ private final int randomTickSpeed;
+ private final boolean tickCropRandomly;
+ private final boolean tickPotRandomly;
+ private final boolean tickSprinklerRandomly;
+ private final boolean scheduledTick;
+
+ private WorldSetting(
+ boolean enableScheduler,
+ int minTickUnit,
+ boolean tickCropRandomly,
+ int tickCropInterval,
+ boolean tickPotRandomly,
+ int tickPotInterval,
+ boolean tickSprinklerRandomly,
+ int tickSprinklerInterval,
+ boolean offlineGrow,
+ boolean enableSeason,
+ boolean autoSeasonChange,
+ int seasonDuration,
+ int cropPerChunk,
+ int potPerChunk,
+ int sprinklerPerChunk,
+ int randomTickSpeed
+ ) {
+ this.enableScheduler = enableScheduler;
+ this.minTickUnit = minTickUnit;
+ this.tickCropInterval = tickCropInterval;
+ this.tickPotInterval = tickPotInterval;
+ this.tickSprinklerInterval = tickSprinklerInterval;
+ this.offlineGrow = offlineGrow;
+ this.enableSeason = enableSeason;
+ this.autoSeasonChange = autoSeasonChange;
+ this.seasonDuration = seasonDuration;
+ this.cropPerChunk = cropPerChunk;
+ this.potPerChunk = potPerChunk;
+ this.sprinklerPerChunk = sprinklerPerChunk;
+ this.randomTickSpeed = randomTickSpeed;
+ this.tickCropRandomly = tickCropRandomly;
+ this.tickPotRandomly = tickPotRandomly;
+ this.tickSprinklerRandomly = tickSprinklerRandomly;
+ this.scheduledTick = !(tickCropRandomly && tickPotRandomly && tickSprinklerRandomly);
+ }
+
+ public static WorldSetting of(
+ boolean enableScheduler,
+ int minTickUnit,
+ boolean tickCropRandomly,
+ int tickCropInterval,
+ boolean tickPotRandomly,
+ int tickPotInterval,
+ boolean tickSprinklerRandomly,
+ int tickSprinklerInterval,
+ boolean offlineGrow,
+ boolean enableSeason,
+ boolean autoSeasonChange,
+ int seasonDuration,
+ int cropPerChunk,
+ int potPerChunk,
+ int sprinklerPerChunk,
+ int randomTickSpeed
+ ) {
+ return new WorldSetting(
+ enableScheduler,
+ minTickUnit,
+ tickCropRandomly,
+ tickCropInterval,
+ tickPotRandomly,
+ tickPotInterval,
+ tickSprinklerRandomly,
+ tickSprinklerInterval,
+ offlineGrow,
+ enableSeason,
+ autoSeasonChange,
+ seasonDuration,
+ cropPerChunk,
+ potPerChunk,
+ sprinklerPerChunk,
+ randomTickSpeed
+ );
+ }
+
+ public boolean isEnableScheduler() {
+ return enableScheduler;
+ }
+
+ public int getMinTickUnit() {
+ return minTickUnit;
+ }
+
+ public int getTickCropInterval() {
+ return tickCropInterval;
+ }
+
+ public int getTickPotInterval() {
+ return tickPotInterval;
+ }
+
+ public int getTickSprinklerInterval() {
+ return tickSprinklerInterval;
+ }
+
+ public boolean isOfflineGrow() {
+ return offlineGrow;
+ }
+
+ public boolean isEnableSeason() {
+ return enableSeason;
+ }
+
+ public boolean isAutoSeasonChange() {
+ return autoSeasonChange;
+ }
+
+ public int getSeasonDuration() {
+ return seasonDuration;
+ }
+
+ public int getPotPerChunk() {
+ return potPerChunk;
+ }
+
+ public int getCropPerChunk() {
+ return cropPerChunk;
+ }
+
+ public int getSprinklerPerChunk() {
+ return sprinklerPerChunk;
+ }
+
+ public int getRandomTickSpeed() {
+ return randomTickSpeed;
+ }
+
+ public boolean isScheduledTick() {
+ return scheduledTick;
+ }
+
+ @Override
+ public WorldSetting clone() {
+ try {
+ return (WorldSetting) super.clone();
+ } catch (CloneNotSupportedException e) {
+ throw new AssertionError();
+ }
+ }
+
+ public boolean randomTickCrop() {
+ return tickCropRandomly;
+ }
+
+ public boolean randomTickSprinkler() {
+ return tickSprinklerRandomly;
+ }
+
+ public boolean randomTickPot() {
+ return tickPotRandomly;
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/object/CCSprinkler.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSprinkler.java
similarity index 69%
rename from api/src/main/java/net/momirealms/customcrops/api/object/CCSprinkler.java
rename to api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSprinkler.java
index ea8b4b1..b26f2ec 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/object/CCSprinkler.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/WorldSprinkler.java
@@ -15,28 +15,18 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.mechanic.world.level;
-/**
- * Sprinkler
- */
-public interface CCSprinkler {
+import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
+import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
+
+public interface WorldSprinkler extends CustomCropsBlock {
- /**
- * Get the remaining water
- * @return water amount
- */
int getWater();
- /**
- * Set the remaining water
- * @param water water
- */
void setWater(int water);
- /**
- * Get the sprinkler config key
- * @return sprinkler key
- */
String getKey();
+
+ Sprinkler getConfig();
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/season/Season.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/season/Season.java
new file mode 100644
index 0000000..187e161
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/season/Season.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.mechanic.world.season;
+
+public enum Season {
+
+ SPRING,
+ SUMMER,
+ AUTUMN,
+ WINTER;
+
+ public Season getNextSeason() {
+ return Season.values()[(this.ordinal() + 1) % 4];
+ }
+}
\ No newline at end of file
diff --git a/api/src/main/java/net/momirealms/customcrops/api/object/CCPot.java b/api/src/main/java/net/momirealms/customcrops/api/object/CCPot.java
deleted file mode 100644
index bc5017f..0000000
--- a/api/src/main/java/net/momirealms/customcrops/api/object/CCPot.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object;
-
-/**
- * Pot
- */
-public interface CCPot {
-
- /**
- * Get the pot config key
- * @return key
- */
- String getKey();
-
- /**
- * Get the fertilizer inside the pot
- * @return fertilizer
- */
- CCFertilizer getFertilizer();
-
- /**
- * Set the fertilizer to the pot
- * @param fertilizer fertilizer
- */
- void setFertilizer(CCFertilizer fertilizer);
-
- /**
- * Get the water amount
- * @return water amount
- */
- int getWater();
-
- /**
- * Whether the pot is wet
- * @return wet or not
- */
- boolean isWet();
-
- /**
- * Add water to pot
- * @param amount water amount
- * @return whether the pot is previously dry
- */
- boolean addWater(int amount);
-
- /**
- * Set water amount
- * @param amount amount
- */
- void setWater(int amount);
-}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/object/CCWorldSeason.java b/api/src/main/java/net/momirealms/customcrops/api/scheduler/CancellableTask.java
similarity index 72%
rename from api/src/main/java/net/momirealms/customcrops/api/object/CCWorldSeason.java
rename to api/src/main/java/net/momirealms/customcrops/api/scheduler/CancellableTask.java
index 041afc6..d968878 100644
--- a/api/src/main/java/net/momirealms/customcrops/api/object/CCWorldSeason.java
+++ b/api/src/main/java/net/momirealms/customcrops/api/scheduler/CancellableTask.java
@@ -15,22 +15,19 @@
* along with this program. If not, see .
*/
-package net.momirealms.customcrops.api.object;
+package net.momirealms.customcrops.api.scheduler;
-/**
- * Season
- */
-public interface CCWorldSeason {
+public interface CancellableTask {
/**
- * SPRING, SUMMER, AUTUMN, WINTER
- * @return season
+ * Cancel the task
*/
- String getSeason();
+ void cancel();
/**
- * Get the season display name
- * @return display name
+ * Get if the task is cancelled or not
+ *
+ * @return cancelled or not
*/
- String getDisplay();
+ boolean isCancelled();
}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/scheduler/Scheduler.java b/api/src/main/java/net/momirealms/customcrops/api/scheduler/Scheduler.java
new file mode 100644
index 0000000..2e72170
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/scheduler/Scheduler.java
@@ -0,0 +1,93 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.scheduler;
+
+import org.bukkit.Location;
+
+import java.util.concurrent.TimeUnit;
+
+public interface Scheduler {
+
+ /**
+ * Runs a task synchronously on the main server thread or region thread.
+ *
+ * @param runnable The task to run.
+ * @param location The location associated with the task.
+ */
+ void runTaskSync(Runnable runnable, Location location);
+
+ /**
+ * Runs a task synchronously with a specified delay and period.
+ *
+ * @param runnable The task to run.
+ * @param location The location associated with the task.
+ * @param delayTicks The delay in ticks before the first execution.
+ * @param periodTicks The period between subsequent executions in ticks.
+ * @return A CancellableTask for managing the scheduled task.
+ */
+ CancellableTask runTaskSyncTimer(Runnable runnable, Location location, long delayTicks, long periodTicks);
+
+ /**
+ * Runs a task asynchronously with a specified delay.
+ *
+ * @param runnable The task to run.
+ * @param delay The delay before the task execution.
+ * @param timeUnit The time unit for the delay.
+ * @return A CancellableTask for managing the scheduled task.
+ */
+ CancellableTask runTaskAsyncLater(Runnable runnable, long delay, TimeUnit timeUnit);
+
+ /**
+ * Runs a task asynchronously.
+ *
+ * @param runnable The task to run.
+ */
+ void runTaskAsync(Runnable runnable);
+
+ /**
+ * Runs a task synchronously with a specified delay.
+ *
+ * @param runnable The task to run.
+ * @param location The location associated with the task.
+ * @param delay The delay before the task execution.
+ * @param timeUnit The time unit for the delay.
+ * @return A CancellableTask for managing the scheduled task.
+ */
+ CancellableTask runTaskSyncLater(Runnable runnable, Location location, long delay, TimeUnit timeUnit);
+
+ /**
+ * Runs a task synchronously with a specified delay in ticks.
+ *
+ * @param runnable The task to run.
+ * @param location The location associated with the task.
+ * @param delayTicks The delay in ticks before the task execution.
+ * @return A CancellableTask for managing the scheduled task.
+ */
+ CancellableTask runTaskSyncLater(Runnable runnable, Location location, long delayTicks);
+
+ /**
+ * Runs a task asynchronously with a specified delay and period.
+ *
+ * @param runnable The task to run.
+ * @param delay The delay before the first execution.
+ * @param period The period between subsequent executions.
+ * @param timeUnit The time unit for the delay and period.
+ * @return A CancellableTask for managing the scheduled task.
+ */
+ CancellableTask runTaskAsyncTimer(Runnable runnable, long delay, long period, TimeUnit timeUnit);
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/util/LocationUtils.java b/api/src/main/java/net/momirealms/customcrops/api/util/LocationUtils.java
new file mode 100644
index 0000000..e865ce0
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/util/LocationUtils.java
@@ -0,0 +1,44 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.util;
+
+import org.bukkit.Bukkit;
+import org.bukkit.Location;
+
+public class LocationUtils {
+
+ private LocationUtils() {}
+
+ /**
+ * Calculates the Euclidean distance between two locations in 3D space.
+ *
+ * @param location1 The first location
+ * @param location2 The second location
+ * @return The Euclidean distance between the two locations
+ */
+ public static double getDistance(Location location1, Location location2) {
+ return Math.sqrt(Math.pow(location2.getX() - location1.getX(), 2) +
+ Math.pow(location2.getY() - location1.getY(), 2) +
+ Math.pow(location2.getZ() - location1.getZ(), 2)
+ );
+ }
+
+ public static Location getAnyLocationInstance() {
+ return new Location(Bukkit.getWorlds().get(0), 0, 64, 0);
+ }
+}
diff --git a/api/src/main/java/net/momirealms/customcrops/api/util/LogUtils.java b/api/src/main/java/net/momirealms/customcrops/api/util/LogUtils.java
new file mode 100644
index 0000000..1f03d49
--- /dev/null
+++ b/api/src/main/java/net/momirealms/customcrops/api/util/LogUtils.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops.api.util;
+
+import net.momirealms.customcrops.api.CustomCropsPlugin;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.logging.Level;
+
+/**
+ * Utility class for logging messages with various log levels.
+ */
+public final class LogUtils {
+
+ private LogUtils() {}
+
+ /**
+ * Log an informational message.
+ *
+ * @param message The message to log.
+ */
+ public static void info(@NotNull String message) {
+ CustomCropsPlugin.getInstance().getLogger().info(message);
+ }
+
+ /**
+ * Log a warning message.
+ *
+ * @param message The message to log.
+ */
+ public static void warn(@NotNull String message) {
+ CustomCropsPlugin.getInstance().getLogger().warning(message);
+ }
+
+ /**
+ * Log a severe error message.
+ *
+ * @param message The message to log.
+ */
+ public static void severe(@NotNull String message) {
+ CustomCropsPlugin.getInstance().getLogger().severe(message);
+ }
+
+ /**
+ * Log a warning message with a throwable exception.
+ *
+ * @param message The message to log.
+ * @param throwable The throwable exception to log.
+ */
+ public static void warn(@NotNull String message, Throwable throwable) {
+ CustomCropsPlugin.getInstance().getLogger().log(Level.WARNING, message, throwable);
+ }
+
+ /**
+ * Log a severe error message with a throwable exception.
+ *
+ * @param message The message to log.
+ * @param throwable The throwable exception to log.
+ */
+ public static void severe(@NotNull String message, Throwable throwable) {
+ CustomCropsPlugin.getInstance().getLogger().log(Level.SEVERE, message, throwable);
+ }
+}
diff --git a/build.gradle.kts b/build.gradle.kts
index 0c162f7..7355535 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -8,7 +8,7 @@ plugins {
allprojects {
project.group = "net.momirealms"
- project.version = "3.3.1.16"
+ project.version = "3.4.0.0"
apply()
apply(plugin = "java")
@@ -21,8 +21,8 @@ allprojects {
}
repositories {
- maven("https://maven.aliyun.com/repository/public/")
mavenCentral()
+ maven("https://maven.aliyun.com/repository/public/")
maven("https://betonquest.org/nexus/repository/betonquest/")
maven("https://maven.enginehub.org/repo/")
maven("https://oss.sonatype.org/content/groups/public/")
@@ -40,21 +40,9 @@ allprojects {
maven("https://r.irepo.space/maven/")
maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://nexus.betonquest.org/repository/betonquest/")
- }
-
- dependencies {
- testImplementation("org.junit.jupiter:junit-jupiter-api:5.9.3")
- testImplementation("org.junit.jupiter:junit-jupiter-params:5.9.3")
- testImplementation("org.junit.jupiter:junit-jupiter-engine:5.9.3")
- }
-
- tasks.processResources {
- val props = mapOf("version" to version)
- inputs.properties(props)
- filteringCharset = "UTF-8"
- filesMatching("plugin.yml") {
- expand(props)
- }
+ maven("https://repo.infernalsuite.com/repository/maven-releases/")
+ maven("https://repo.rapture.pw/repository/maven-releases/")
+ maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}
}
diff --git a/gradle.properties b/gradle.properties
index d508eeb..16d5100 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -1,8 +1,8 @@
#systemProp.socks.proxyHost=127.0.0.1
#systemProp.socks.proxyPort=7890
-#
+
#systemProp.http.proxyHost=127.0.0.1
#systemProp.http.proxyPort=7890
-#
+
#systemProp.https.proxyHost=127.0.0.1
#systemProp.https.proxyPort=7890
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index d1da74a..269ed93 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-8.5-bin.zip
+distributionUrl=https://services.gradle.org/distributions/gradle-8.6-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
\ No newline at end of file
diff --git a/plugin/build.gradle.kts b/plugin/build.gradle.kts
index 163308a..d35513a 100644
--- a/plugin/build.gradle.kts
+++ b/plugin/build.gradle.kts
@@ -1,45 +1,73 @@
dependencies {
- compileOnly(fileTree("libs"))
+ // Platform
+ compileOnly("dev.folia:folia-api:1.20.1-R0.1-SNAPSHOT")
+ compileOnly("com.infernalsuite.aswm:api:1.20.4-R0.1-SNAPSHOT")
+
+ // Command
+ compileOnly("dev.jorel:commandapi-bukkit-core:9.3.0")
+
+ // Common hooks
compileOnly("me.clip:placeholderapi:2.11.5")
- compileOnly("io.papermc.paper:paper-api:1.20.1-R0.1-SNAPSHOT")
- compileOnly("dev.dejvokep:boosted-yaml:1.3.1")
- compileOnly("commons-io:commons-io:2.11.0")
- compileOnly("com.google.code.gson:gson:2.10.1")
- compileOnly("com.github.LoneDev6:api-itemsadder:3.4.1e")
- compileOnly("com.github.oraxen:oraxen:1.168.0")
- compileOnly("io.lumine:Mythic-Dist:5.2.1")
- compileOnly("io.lumine:MythicLib-dist:1.6-SNAPSHOT")
- compileOnly("com.willfp:eco:6.65.1")
- compileOnly("com.willfp:EcoJobs:3.13.0")
- compileOnly("net.objecthunter:exp4j:0.4.8")
- compileOnly("net.Indyuce:MMOItems-API:6.9.2-SNAPSHOT")
- compileOnly("pers.neige.neigeitems:NeigeItems:1.14.23")
- compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.21")
- compileOnly("com.willfp:EcoSkills:3.36.1")
- compileOnly("com.github.Zrips:Jobs:4.17.2")
+ compileOnly("com.comphenix.protocol:ProtocolLib:5.1.0")
compileOnly("com.github.MilkBowl:VaultAPI:1.7")
- compileOnly("com.comphenix.protocol:ProtocolLib:5.0.0")
+
+ // Utils
+ compileOnly("dev.dejvokep:boosted-yaml:1.3.2")
+ compileOnly("commons-io:commons-io:2.15.1")
+ compileOnly("com.google.code.gson:gson:2.10.1")
+ compileOnly("net.objecthunter:exp4j:0.4.8")
+
+ // eco
+ compileOnly("com.willfp:eco:6.67.2")
+ compileOnly("com.willfp:EcoJobs:3.47.1")
+ compileOnly("com.willfp:EcoSkills:3.21.0")
+ compileOnly("com.willfp:libreforge:4.48.1")
+
compileOnly("net.Indyuce:MMOCore-API:1.12-SNAPSHOT")
+ compileOnly("com.github.Archy-X:AureliumSkills:Beta1.3.24")
+ compileOnly("com.github.Zrips:Jobs:4.17.2")
+ compileOnly("dev.aurelium:auraskills-api-bukkit:2.0.0-SNAPSHOT")
+
+ // Items
+ compileOnly("com.github.LoneDev6:api-itemsadder:3.6.2-beta-r3-b")
+ compileOnly("com.github.oraxen:oraxen:1.168.0")
+ compileOnly("pers.neige.neigeitems:NeigeItems:1.16.24")
+ compileOnly("net.Indyuce:MMOItems-API:6.9.2-SNAPSHOT")
+ compileOnly("io.lumine:MythicLib-dist:1.6-SNAPSHOT")
+ compileOnly("io.lumine:Mythic-Dist:5.3.5")
+
+ // Quests
compileOnly("org.betonquest:betonquest:2.0.0")
+ compileOnly(files("libs/BattlePass-4.0.6-api.jar"))
+ compileOnly(files("libs/ClueScrolls-api.jar"))
+ compileOnly(files("libs/AdvancedSeasons-API.jar"))
+ compileOnly(files("libs/zaphkiel-2.0.24.jar"))
+ compileOnly(files("libs/mcMMO-api.jar"))
+ compileOnly(files("libs/RealisticSeasons-api.jar"))
+
implementation(project(":api"))
implementation("net.kyori:adventure-api:4.15.0")
implementation("net.kyori:adventure-platform-bukkit:4.3.2")
- implementation("net.kyori:adventure-text-minimessage:4.15.0")
- implementation("net.kyori:adventure-text-serializer-legacy:4.15.0")
- implementation("com.github.Xiao-MoMi:AntiGriefLib:0.7")
- implementation("de.tr7zw:item-nbt-api:2.12.2")
- implementation("org.bstats:bstats-bukkit:3.0.2")
- implementation(files("libs/BiomeAPI.jar"))
+ compileOnly("com.github.Xiao-MoMi:AntiGriefLib:0.7")
+ compileOnly("com.github.Xiao-MoMi:BiomeAPI:0.2")
+ compileOnly("net.kyori:adventure-text-minimessage:4.15.0")
+ compileOnly("net.kyori:adventure-text-serializer-legacy:4.15.0")
+ compileOnly("de.tr7zw:item-nbt-api:2.12.2")
+ compileOnly("org.bstats:bstats-bukkit:3.0.2")
+ implementation("org.lz4:lz4-java:1.8.0")
+ implementation("com.flowpowered:flow-nbt:2.0.2")
+ implementation("com.github.luben:zstd-jni:1.5.5-11")
}
tasks {
shadowJar {
- relocate ("de.tr7zw.changeme", "net.momirealms.customcrops.libraries")
- relocate ("de.tr7zw.annotations", "net.momirealms.customcrops.libraries.annotations")
+ relocate ("de.tr7zw.changeme", "net.momirealms.customcrops.libraries.changeme")
+ relocate ("dev.jorel.commandapi", "net.momirealms.customcrops.libraries.commandapi")
relocate ("net.kyori", "net.momirealms.customcrops.libraries")
+ relocate ("org.objenesis", "net.momirealms.customcrops.libraries.objenesis")
relocate ("org.bstats", "net.momirealms.customcrops.libraries.bstats")
relocate ("net.momirealms.biomeapi", "net.momirealms.customcrops.libraries.biomeapi")
- relocate ("net.momirealms.antigrieflib", "net.momirealms.customcrops.libraries.antigrieflib")
+ relocate ("net.momirealms.antigrieflib", "net.momirealms.customcrops.libraries.antigrieflib")
}
-}
+}
\ No newline at end of file
diff --git a/plugin/libs/BiomeAPI.jar b/plugin/libs/BiomeAPI.jar
deleted file mode 100644
index 59096aa..0000000
Binary files a/plugin/libs/BiomeAPI.jar and /dev/null differ
diff --git a/plugin/libs/zaphkiel-2.0.24.jar b/plugin/libs/zaphkiel-2.0.24.jar
new file mode 100644
index 0000000..ac48bf0
Binary files /dev/null and b/plugin/libs/zaphkiel-2.0.24.jar differ
diff --git a/plugin/src/main/java/net/momirealms/customcrops/CustomCrops.java b/plugin/src/main/java/net/momirealms/customcrops/CustomCrops.java
deleted file mode 100644
index eb2d8ce..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/CustomCrops.java
+++ /dev/null
@@ -1,301 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops;
-
-import com.comphenix.protocol.ProtocolLibrary;
-import com.comphenix.protocol.ProtocolManager;
-import net.kyori.adventure.platform.bukkit.BukkitAudiences;
-import net.momirealms.antigrieflib.AntiGriefLib;
-import net.momirealms.customcrops.api.CustomCropsAPIImpl;
-import net.momirealms.customcrops.api.CustomCropsPlugin;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.basic.MessageManager;
-import net.momirealms.customcrops.api.object.crop.CropManager;
-import net.momirealms.customcrops.api.object.fertilizer.FertilizerManager;
-import net.momirealms.customcrops.api.object.hologram.HologramManager;
-import net.momirealms.customcrops.api.object.pot.PotManager;
-import net.momirealms.customcrops.api.object.scheduler.Scheduler;
-import net.momirealms.customcrops.api.object.season.SeasonManager;
-import net.momirealms.customcrops.api.object.sprinkler.SprinklerManager;
-import net.momirealms.customcrops.api.object.wateringcan.WateringCanManager;
-import net.momirealms.customcrops.api.object.world.WorldDataManager;
-import net.momirealms.customcrops.command.CustomCropsCommand;
-import net.momirealms.customcrops.customplugin.Platform;
-import net.momirealms.customcrops.customplugin.PlatformInterface;
-import net.momirealms.customcrops.customplugin.PlatformManager;
-import net.momirealms.customcrops.customplugin.itemsadder.ItemsAdderPluginImpl;
-import net.momirealms.customcrops.customplugin.oraxen.OraxenPluginImpl;
-import net.momirealms.customcrops.helper.LibraryLoader;
-import net.momirealms.customcrops.helper.VersionHelper;
-import net.momirealms.customcrops.integration.IntegrationManager;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bstats.bukkit.Metrics;
-import org.bukkit.Bukkit;
-import org.bukkit.World;
-import org.bukkit.command.PluginCommand;
-import org.bukkit.plugin.PluginManager;
-
-import java.util.TimeZone;
-
-public final class CustomCrops extends CustomCropsPlugin {
-
- private static BukkitAudiences adventure;
- private static CustomCrops plugin;
- private static ProtocolManager protocolManager;
- private Platform platform;
- private PlatformInterface platformInterface;
- private CropManager cropManager;
- private IntegrationManager integrationManager;
- private WorldDataManager worldDataManager;
- private SprinklerManager sprinklerManager;
- private WateringCanManager wateringCanManager;
- private FertilizerManager fertilizerManager;
- private SeasonManager seasonManager;
- private PotManager potManager;
- private ConfigManager configManager;
- private MessageManager messageManager;
- private PlatformManager platformManager;
- private HologramManager hologramManager;
- private VersionHelper versionHelper;
- private Scheduler scheduler;
- private AntiGriefLib antiGriefLib;
-
- @Override
- public void onLoad(){
- plugin = this;
- instance = this;
- this.loadLibs();
- this.antiGriefLib = AntiGriefLib.builder(this)
- .ignoreOP(true)
- .build();
- }
-
- @Override
- public void onEnable() {
- adventure = BukkitAudiences.create(this);
- protocolManager = ProtocolLibrary.getProtocolManager();
- this.versionHelper = new VersionHelper(this);
- if (versionHelper.isSpigot()) {
- AdventureUtils.consoleMessage("========================[CustomCrops]=========================");
- AdventureUtils.consoleMessage(" Spigot is not officially supported by CustomCrops");
- AdventureUtils.consoleMessage(" Please use Paper or its forks");
- AdventureUtils.consoleMessage(" Paper download link: https://papermc.io/downloads");
- AdventureUtils.consoleMessage("==============================================================");
- Bukkit.getPluginManager().disablePlugin(this);
- return;
- }
-
- if (!this.loadPlatform()) return;
- this.registerCommands();
- AdventureUtils.consoleMessage("[CustomCrops] Running on " + Bukkit.getVersion());
-
- this.scheduler = new Scheduler(this);
- this.configManager = new ConfigManager(this);
- this.messageManager = new MessageManager(this);
- this.cropManager = new CropManager(this);
- this.integrationManager = new IntegrationManager(this);
- this.seasonManager = new SeasonManager(this);
- this.worldDataManager = new WorldDataManager(this);
- this.sprinklerManager = new SprinklerManager(this);
- this.wateringCanManager = new WateringCanManager(this);
- this.fertilizerManager = new FertilizerManager(this);
- this.potManager = new PotManager(this);
- this.hologramManager = new HologramManager(this);
- this.platformManager = new PlatformManager(this);
- super.customCropsAPI = new CustomCropsAPIImpl(this);
-
- this.reload();
-
- for (World world : Bukkit.getWorlds()) {
- this.worldDataManager.loadWorld(world);
- }
-
- AdventureUtils.consoleMessage("[CustomCrops] Plugin Enabled!");
- if (ConfigManager.enableBStats) new Metrics(this, 16593);
- if (ConfigManager.checkUpdate) this.versionHelper.checkUpdate();
-
- antiGriefLib.init();
- }
-
- public void reload() {
- this.configManager.unload();
- this.messageManager.unload();
- this.cropManager.unload();
- this.integrationManager.unload();
- this.worldDataManager.unload();
- this.sprinklerManager.unload();
- this.wateringCanManager.unload();
- this.fertilizerManager.unload();
- this.potManager.unload();
- this.seasonManager.unload();
- this.platformManager.unload();
- this.hologramManager.unload();
-
- this.configManager.load();
- this.messageManager.load();
- this.integrationManager.load();
- this.cropManager.load();
- this.worldDataManager.load();
- this.sprinklerManager.load();
- this.wateringCanManager.load();
- this.fertilizerManager.load();
- this.potManager.load();
- this.seasonManager.load();
- this.platformManager.load();
- this.hologramManager.load();
- }
-
- @Override
- public void onDisable() {
- if (adventure != null) adventure.close();
- if (this.cropManager != null) this.cropManager.unload();
- if (this.worldDataManager != null) this.worldDataManager.disable();
- if (this.seasonManager != null) this.seasonManager.unload();
- if (this.sprinklerManager != null) this.sprinklerManager.unload();
- if (this.wateringCanManager != null) this.wateringCanManager.unload();
- if (this.fertilizerManager != null) this.fertilizerManager.unload();
- if (this.platformManager != null) this.platformManager.unload();
- if (this.potManager != null) this.potManager.unload();
- if (this.messageManager != null) this.messageManager.unload();
- if (this.configManager != null) this.configManager.unload();
- if (this.integrationManager != null) this.integrationManager.unload();
- if (this.hologramManager != null) this.hologramManager.unload();
- if (this.scheduler != null) this.scheduler.disable();
- }
-
- private void loadLibs() {
- TimeZone timeZone = TimeZone.getDefault();
- String libRepo = timeZone.getID().startsWith("Asia") ? "https://maven.aliyun.com/repository/public/" : "https://repo.maven.apache.org/maven2/";
- LibraryLoader.load("dev.dejvokep","boosted-yaml","1.3.1", libRepo);
- LibraryLoader.load("commons-io","commons-io","2.11.0", libRepo);
- LibraryLoader.load("net.objecthunter","exp4j","0.4.8", libRepo);
- }
-
- private void registerCommands() {
- CustomCropsCommand customCropsCommand = new CustomCropsCommand();
- PluginCommand pluginCommand = Bukkit.getPluginCommand("customcrops");
- if (pluginCommand != null) {
- pluginCommand.setExecutor(customCropsCommand);
- pluginCommand.setTabCompleter(customCropsCommand);
- }
- }
-
- private boolean loadPlatform() {
- PluginManager pluginManager = Bukkit.getPluginManager();
- if (pluginManager.getPlugin("ItemsAdder") != null) {
- this.platform = Platform.ItemsAdder;
- this.platformInterface = new ItemsAdderPluginImpl();
- }
- else if (pluginManager.getPlugin("Oraxen") != null) {
- this.platform = Platform.Oraxen;
- this.platformInterface = new OraxenPluginImpl();
- }
- if (this.platform == null) {
- AdventureUtils.consoleMessage("========================[CustomCrops]=========================");
- AdventureUtils.consoleMessage(" Please install ItemsAdder or Oraxen as dependency.");
- AdventureUtils.consoleMessage(" ItemsAdder Link: https://www.spigotmc.org/resources/73355/");
- AdventureUtils.consoleMessage(" Oraxen link: https://www.spigotmc.org/resources/72448/");
- AdventureUtils.consoleMessage("==============================================================");
- Bukkit.getPluginManager().disablePlugin(this);
- return false;
- } else {
- AdventureUtils.consoleMessage("[CustomCrops] Platform: " + platform.name());
- return true;
- }
- }
-
- public static BukkitAudiences getAdventure() {
- return adventure;
- }
-
- public static CustomCrops getInstance() {
- return plugin;
- }
-
- public static ProtocolManager getProtocolManager() {
- return protocolManager;
- }
-
- public CropManager getCropManager() {
- return cropManager;
- }
-
- public VersionHelper getVersionHelper() {
- return versionHelper;
- }
-
- public Platform getPlatform() {
- return platform;
- }
-
- public IntegrationManager getIntegrationManager() {
- return integrationManager;
- }
-
- public PlatformInterface getPlatformInterface() {
- return platformInterface;
- }
-
- public WorldDataManager getWorldDataManager() {
- return worldDataManager;
- }
-
- public SprinklerManager getSprinklerManager() {
- return sprinklerManager;
- }
-
- public PotManager getPotManager() {
- return potManager;
- }
-
- public WateringCanManager getWateringCanManager() {
- return wateringCanManager;
- }
-
- public FertilizerManager getFertilizerManager() {
- return fertilizerManager;
- }
-
- public SeasonManager getSeasonManager() {
- return seasonManager;
- }
-
- public ConfigManager getConfigManager() {
- return configManager;
- }
-
- public MessageManager getMessageManager() {
- return messageManager;
- }
-
- public PlatformManager getPlatformManager() {
- return platformManager;
- }
-
- public HologramManager getHologramManager() {
- return hologramManager;
- }
-
- public Scheduler getScheduler() {
- return scheduler;
- }
-
- public AntiGriefLib getAntiGriefLib() {
- return antiGriefLib;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java b/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java
new file mode 100644
index 0000000..7eb37be
--- /dev/null
+++ b/plugin/src/main/java/net/momirealms/customcrops/CustomCropsPluginImpl.java
@@ -0,0 +1,206 @@
+/*
+ * Copyright (C) <2022>
+ *
+ * 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
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see .
+ */
+
+package net.momirealms.customcrops;
+
+import de.tr7zw.changeme.nbtapi.utils.MinecraftVersion;
+import de.tr7zw.changeme.nbtapi.utils.VersionChecker;
+import net.momirealms.antigrieflib.AntiGriefLib;
+import net.momirealms.customcrops.api.CustomCropsPlugin;
+import net.momirealms.customcrops.api.event.CustomCropsReloadEvent;
+import net.momirealms.customcrops.api.manager.ConfigManager;
+import net.momirealms.customcrops.api.manager.CoolDownManager;
+import net.momirealms.customcrops.api.util.LogUtils;
+import net.momirealms.customcrops.compatibility.IntegrationManagerImpl;
+import net.momirealms.customcrops.libraries.classpath.ReflectionClassPathAppender;
+import net.momirealms.customcrops.libraries.dependencies.Dependency;
+import net.momirealms.customcrops.libraries.dependencies.DependencyManager;
+import net.momirealms.customcrops.libraries.dependencies.DependencyManagerImpl;
+import net.momirealms.customcrops.manager.*;
+import net.momirealms.customcrops.mechanic.action.ActionManagerImpl;
+import net.momirealms.customcrops.mechanic.condition.ConditionManagerImpl;
+import net.momirealms.customcrops.mechanic.item.ItemManagerImpl;
+import net.momirealms.customcrops.mechanic.requirement.RequirementManagerImpl;
+import net.momirealms.customcrops.mechanic.world.WorldManagerImpl;
+import net.momirealms.customcrops.scheduler.SchedulerImpl;
+import net.momirealms.customcrops.utils.EventUtils;
+import org.bstats.bukkit.Metrics;
+import org.bukkit.Bukkit;
+
+import java.lang.reflect.Field;
+import java.util.ArrayList;
+import java.util.List;
+
+public class CustomCropsPluginImpl extends CustomCropsPlugin {
+
+ private DependencyManager dependencyManager;
+ private PacketManager packetManager;
+ private CommandManager commandManager;
+ private HologramManager hologramManager;
+ private AntiGriefLib antiGriefLib;
+
+ @Override
+ public void onLoad() {
+ this.dependencyManager = new DependencyManagerImpl(this, new ReflectionClassPathAppender(this.getClassLoader()));
+ this.dependencyManager.loadDependencies(new ArrayList<>(
+ List.of(
+ Dependency.GSON,
+ Dependency.SLF4J_API,
+ Dependency.SLF4J_SIMPLE,
+ Dependency.COMMAND_API,
+ Dependency.NBT_API,
+ Dependency.BOOSTED_YAML,
+ Dependency.ADVENTURE_TEXT_MINIMESSAGE,
+ Dependency.ADVENTURE_LEGACY_SERIALIZER,
+ Dependency.BSTATS_BASE,
+ Dependency.BSTATS_BUKKIT,
+ Dependency.BIOME_API,
+ Dependency.ANTI_GRIEF
+ )
+ ));
+
+ this.antiGriefLib = AntiGriefLib.builder(this)
+ .silentLogs(true)
+ .ignoreOP(true)
+ .build();
+ }
+
+ @Override
+ public void onEnable() {
+ instance = this;
+ this.versionManager = new VersionManagerImpl(this);
+ this.adventure = new AdventureManagerImpl(this);
+ this.scheduler = new SchedulerImpl(this);
+ this.configManager = new ConfigManagerImpl(this);
+ this.integrationManager = new IntegrationManagerImpl(this);
+ this.conditionManager = new ConditionManagerImpl(this);
+ this.actionManager = new ActionManagerImpl(this);
+ this.requirementManager = new RequirementManagerImpl(this);
+ this.coolDownManager = new CoolDownManager(this);
+ this.worldManager = new WorldManagerImpl(this);
+ this.itemManager = new ItemManagerImpl(this, antiGriefLib);
+ this.messageManager = new MessageManagerImpl(this);
+ this.packetManager = new PacketManager(this);
+ this.commandManager = new CommandManager(this);
+ this.placeholderManager = new PlaceholderManagerImpl(this);
+ this.hologramManager = new HologramManager(this);
+ this.commandManager.init();
+ this.antiGriefLib.init();
+ this.integrationManager.init();
+ this.disableNBTAPILogs();
+ this.reload();
+ this.worldManager.init();
+ if (ConfigManager.metrics()) new Metrics(this, 16593);
+ if (ConfigManager.checkUpdate()) {
+ this.versionManager.checkUpdate().thenAccept(result -> {
+ if (!result) this.getAdventure().sendConsoleMessage("[CustomCrops] You are using the latest version.");
+ else this.getAdventure().sendConsoleMessage("[CustomCrops] Update is available: https://polymart.org/resource/2625");
+ });
+ }
+ }
+
+ @Override
+ public void onDisable() {
+ this.commandManager.disable();
+ this.adventure.disable();
+ this.requirementManager.disable();
+ this.actionManager.disable();
+ this.worldManager.disable();
+ this.itemManager.disable();
+ this.conditionManager.disable();
+ this.coolDownManager.disable();
+ this.placeholderManager.disable();
+ ((SchedulerImpl) scheduler).shutdown();
+ instance = null;
+ }
+
+ @Override
+ public void reload() {
+ this.configManager.reload();
+ this.messageManager.reload();
+ this.itemManager.reload();
+ this.worldManager.reload();
+ this.actionManager.reload();
+ this.requirementManager.reload();
+ this.conditionManager.reload();
+ this.coolDownManager.reload();
+ this.placeholderManager.reload();
+ this.hologramManager.reload();
+ ((SchedulerImpl) scheduler).reload();
+ EventUtils.fireAndForget(new CustomCropsReloadEvent(this));
+ }
+
+ /**
+ * Disable NBT API logs
+ */
+ private void disableNBTAPILogs() {
+ MinecraftVersion.disableBStats();
+ MinecraftVersion.disableUpdateCheck();
+ VersionChecker.hideOk = true;
+ try {
+ Field field = MinecraftVersion.class.getDeclaredField("version");
+ field.setAccessible(true);
+ MinecraftVersion minecraftVersion;
+ try {
+ minecraftVersion = MinecraftVersion.valueOf(getVersionManager().getServerVersion().replace("v", "MC"));
+ } catch (IllegalArgumentException ex) {
+ minecraftVersion = MinecraftVersion.UNKNOWN;
+ }
+ field.set(MinecraftVersion.class, minecraftVersion);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ boolean hasGsonSupport;
+ try {
+ Class.forName("com.google.gson.Gson");
+ hasGsonSupport = true;
+ } catch (Exception ex) {
+ hasGsonSupport = false;
+ }
+ try {
+ Field field= MinecraftVersion.class.getDeclaredField("hasGsonSupport");
+ field.setAccessible(true);
+ field.set(Boolean.class, hasGsonSupport);
+ } catch (NoSuchFieldException | IllegalAccessException e) {
+ throw new RuntimeException(e);
+ }
+ }
+
+ @Override
+ public void debug(String debug) {
+ if (ConfigManager.debug()) {
+ LogUtils.info(debug);
+ }
+ }
+
+ public DependencyManager getDependencyManager() {
+ return dependencyManager;
+ }
+
+ public PacketManager getPacketManager() {
+ return packetManager;
+ }
+
+ public HologramManager getHologramManager() {
+ return hologramManager;
+ }
+
+ @Override
+ public boolean isHookedPluginEnabled(String plugin) {
+ return Bukkit.getPluginManager().isPluginEnabled(plugin);
+ }
+}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/CustomCropsAPIImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/CustomCropsAPIImpl.java
deleted file mode 100644
index 41ca4ee..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/CustomCropsAPIImpl.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.CCGrowingCrop;
-import net.momirealms.customcrops.api.object.CCPot;
-import net.momirealms.customcrops.api.object.CCSprinkler;
-import net.momirealms.customcrops.api.object.CCWorldSeason;
-import net.momirealms.customcrops.api.object.season.CCSeason;
-import net.momirealms.customcrops.api.object.season.SeasonData;
-import net.momirealms.customcrops.api.object.world.CCWorld;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Location;
-import org.bukkit.World;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Locale;
-
-public class CustomCropsAPIImpl implements CustomCropsAPI {
-
- private static CustomCropsAPIImpl instance;
- private final CustomCrops plugin;
-
- public CustomCropsAPIImpl(CustomCrops plugin) {
- this.plugin = plugin;
- instance = this;
- }
-
- public static CustomCropsAPIImpl getInstance() {
- return instance;
- }
-
- @Nullable
- public CCPot getPotAt(Location location) {
- return plugin.getWorldDataManager().getPotData(SimpleLocation.getByBukkitLocation(location));
- }
-
- @Nullable
- public CCGrowingCrop getCropAt(Location location) {
- return plugin.getWorldDataManager().getCropData(SimpleLocation.getByBukkitLocation(location));
- }
-
- public boolean isGreenhouseGlass(Location location) {
- return plugin.getWorldDataManager().isGreenhouse(SimpleLocation.getByBukkitLocation(location));
- }
-
- public boolean hasScarecrowInChunk(Location location) {
- return plugin.getWorldDataManager().hasScarecrow(SimpleLocation.getByBukkitLocation(location));
- }
-
- public CCSprinkler getSprinklerAt(Location location) {
- return plugin.getWorldDataManager().getSprinklerData(SimpleLocation.getByBukkitLocation(location));
- }
-
- public void setSeason(String world, String season) {
- SeasonData seasonData = plugin.getSeasonManager().getSeasonData(world);
- if (seasonData != null) {
- seasonData.changeSeason(CCSeason.valueOf(season.toUpperCase(Locale.ENGLISH)));
- }
- }
-
- public void setDate(String world, int date) {
- SeasonData seasonData = plugin.getSeasonManager().getSeasonData(world);
- if (seasonData != null) {
- seasonData.setDate(date);
- }
- }
-
- public void addDate(String world) {
- SeasonData seasonData = plugin.getSeasonManager().getSeasonData(world);
- if (seasonData != null) {
- seasonData.addDate();
- }
- }
-
- @Nullable
- public CCWorldSeason getSeason(String world) {
- SeasonData seasonData = plugin.getSeasonManager().getSeasonData(world);
- if (seasonData != null) {
- return seasonData.getSeason();
- }
- return null;
- }
-
- public void grow(World world, int seconds) {
- CustomCrops.getInstance().getScheduler().runTaskAsync(() -> {
- CCWorld ccworld = CustomCrops.getInstance().getWorldDataManager().getWorld(world.getName());
- if (ccworld != null) {
- ccworld.scheduleConsumeTask(seconds);
- }
- });
- }
-
- public void sprinklerWork(World world, int seconds) {
- CustomCrops.getInstance().getScheduler().runTaskAsync(() -> {
- CCWorld ccworld = CustomCrops.getInstance().getWorldDataManager().getWorld(world.getName());
- if (ccworld != null) {
- ccworld.scheduleSprinklerWork(seconds);
- }
- });
- }
-
- public void consume(World world, int seconds) {
- CustomCrops.getInstance().getScheduler().runTaskAsync(() -> {
- CCWorld ccworld = CustomCrops.getInstance().getWorldDataManager().getWorld(world.getName());
- if (ccworld != null) {
- ccworld.scheduleConsumeTask(seconds);
- }
- });
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/BoneMeal.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/BoneMeal.java
deleted file mode 100644
index dd69e51..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/BoneMeal.java
+++ /dev/null
@@ -1,78 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object;
-
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.CustomCrops;
-import org.bukkit.Particle;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.ArrayList;
-
-public class BoneMeal {
-
- private final String item;
- private final String returned;
- private final ArrayList> pairs;
- private final Sound sound;
- private final Particle particle;
-
- public BoneMeal(
- String item,
- @Nullable String returned,
- @NotNull ArrayList> pairs,
- @Nullable Sound sound,
- @Nullable Particle particle
- ) {
- this.item = item;
- this.returned = returned;
- this.pairs = pairs;
- this.sound = sound;
- this.particle = particle;
- }
-
- public boolean isRightItem(String id) {
- return item.equals(id);
- }
-
- public ItemStack getReturned() {
- if (returned == null) return null;
- return CustomCrops.getInstance().getIntegrationManager().build(returned);
- }
-
- public int getPoint() {
- for (Pair pair : pairs) {
- if (Math.random() < pair.left()) {
- return pair.right();
- }
- }
- return 0;
- }
-
- @Nullable
- public Sound getSound() {
- return sound;
- }
-
- @Nullable
- public Particle getParticle() {
- return particle;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/CrowTask.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/CrowTask.java
deleted file mode 100644
index f898329..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/CrowTask.java
+++ /dev/null
@@ -1,68 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.util.FakeEntityUtils;
-import org.bukkit.Location;
-import org.bukkit.entity.EntityType;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.bukkit.scheduler.BukkitRunnable;
-import org.bukkit.util.Vector;
-
-import java.util.concurrent.ThreadLocalRandom;
-
-public class CrowTask extends BukkitRunnable {
-
- private int timer;
- private final int entityID;
- private final Vector vectorUp;
- private final Location cropLoc;
- private final Player player;
- private final float yaw;
- private final ItemStack fly;
-
- public CrowTask(Player player, Location crop_location, String fly_model, String stand_model) {
- this.cropLoc = crop_location.clone();
- this.timer = 0;
- this.fly = CustomCrops.getInstance().getIntegrationManager().build(fly_model);
- this.player = player;
- this.entityID = ThreadLocalRandom.current().nextInt(Integer.MAX_VALUE);
- this.yaw = ThreadLocalRandom.current().nextInt(361) - 180;
- Location relative = crop_location.clone().subtract(crop_location.clone().add(10 * Math.sin((Math.PI * yaw)/180), 10, - 10 * Math.cos((Math.PI * yaw)/180)));
- this.vectorUp = new Vector(relative.getX() / 75, 0.1, relative.getZ() / 75);
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getSpawnPacket(entityID, crop_location, EntityType.ARMOR_STAND));
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getVanishArmorStandMetaPacket(entityID));
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getEquipPacket(entityID, CustomCrops.getInstance().getIntegrationManager().build(stand_model)));
- }
-
- @Override
- public void run() {
- timer++;
- if (timer == 40) {
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getEquipPacket(entityID, fly));
- } else if (timer > 40) {
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getTeleportPacket(entityID, cropLoc.add(vectorUp), yaw));
- }
- if (timer > 100) {
- CustomCrops.getProtocolManager().sendServerPacket(player, FakeEntityUtils.getDestroyPacket(entityID));
- cancel();
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java
deleted file mode 100644
index a19589f..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/InteractCrop.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.action.Action;
-import net.momirealms.customcrops.api.object.requirement.CurrentState;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.Nullable;
-
-public class InteractCrop {
-
- private final boolean consume;
- private final String id;
- private final String returned;
- private final Action[] actions;
- private final Requirement[] requirements;
-
- public InteractCrop(@Nullable String id, boolean consume, @Nullable String returned, @Nullable Action[] actions, @Nullable Requirement[] requirements) {
- this.consume = consume;
- this.id = id;
- this.returned = returned;
- this.actions = actions;
- this.requirements = requirements;
- }
-
- public boolean isRightItem(String item) {
- if (id == null || id.equals("*")) return true;
- return item.equals(id);
- }
-
- @Nullable
- public ItemStack getReturned() {
- if (returned == null) return null;
- return CustomCrops.getInstance().getIntegrationManager().build(returned);
- }
-
- public boolean isConsumed() {
- return consume;
- }
-
- public Action[] getActions() {
- return actions;
- }
-
- public boolean canInteract(Player player, Location location) {
- if (requirements == null) return true;
- CurrentState currentState = new CurrentState(location, player);
- for (Requirement requirement : requirements) {
- if (!requirement.isConditionMet(currentState)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/OfflineReplaceTask.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/OfflineReplaceTask.java
deleted file mode 100644
index 97a2878..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/OfflineReplaceTask.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.momirealms.customcrops.api.object;
-
-import java.io.Serializable;
-
-public class OfflineReplaceTask implements Serializable {
-
- private final String id;
- private final ItemType itemType;
- private final ItemMode itemMode;
-
- public OfflineReplaceTask(String id, ItemType itemType, ItemMode itemMode) {
- this.id = id;
- this.itemMode = itemMode;
- this.itemType = itemType;
- }
-
- public String getId() {
- return id;
- }
-
- public ItemMode getItemMode() {
- return itemMode;
- }
-
- public ItemType getItemType() {
- return itemType;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ActionBarImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ActionBarImpl.java
deleted file mode 100644
index 46a4fe7..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ActionBarImpl.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record ActionBarImpl(String message, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- AdventureUtils.playerActionbar(player,
- message.replace("{player}", player.getName())
- .replace("{world}", player.getWorld().getName())
- .replace("{x}", cropLoc == null ? "" : String.valueOf(cropLoc.getX()))
- .replace("{y}", cropLoc == null ? "" : String.valueOf(cropLoc.getY()))
- .replace("{z}", cropLoc == null ? "" : String.valueOf(cropLoc.getZ()))
- );
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/BreakImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/BreakImpl.java
deleted file mode 100644
index 49099a5..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/BreakImpl.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.event.CropBreakEvent;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.crop.CropConfig;
-import net.momirealms.customcrops.api.object.crop.StageConfig;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Bukkit;
-import org.bukkit.Chunk;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.concurrent.CompletableFuture;
-
-public class BreakImpl implements Action {
-
- private final boolean triggerAction;
- private final String stageID;
-
- public BreakImpl(boolean triggerAction, @Nullable String stageID) {
- this.triggerAction = triggerAction;
- this.stageID = stageID;
- }
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (cropLoc == null || stageID == null) return;
- CropConfig cropConfig = CustomCrops.getInstance().getCropManager().getCropConfigByStage(stageID);
- Location bLoc = cropLoc.getBukkitLocation();
- if (bLoc == null || cropConfig == null) return;
- if (player != null) {
- CropBreakEvent cropBreakEvent = new CropBreakEvent(player, cropConfig.getKey(), stageID, bLoc);
- Bukkit.getPluginManager().callEvent(cropBreakEvent);
- if (cropBreakEvent.isCancelled()) {
- return;
- }
- CustomCrops.getInstance().getPlatformInterface().removeAnyThingAt(bLoc);
- CustomCrops.getInstance().getWorldDataManager().removeCropData(cropLoc);
- doTriggerActions(player, cropLoc, itemMode);
- } else {
- CompletableFuture asyncGetChunk = bLoc.getWorld().getChunkAtAsync(bLoc.getBlockX() >> 4, bLoc.getBlockZ() >> 4);
- if (itemMode == ItemMode.ITEM_FRAME || itemMode == ItemMode.ITEM_DISPLAY) {
- CompletableFuture loadEntities = asyncGetChunk.thenApply((chunk) -> {
- chunk.getEntities();
- return chunk.isEntitiesLoaded();
- });
- loadEntities.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- CustomCrops.getInstance().getWorldDataManager().removeCropData(cropLoc);
- if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(bLoc, itemMode)) {
- doTriggerActions(null, cropLoc, itemMode);
- }
- }));
- } else {
- asyncGetChunk.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- CustomCrops.getInstance().getWorldDataManager().removeCropData(cropLoc);
- if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(bLoc, itemMode)) {
- doTriggerActions(null, cropLoc, itemMode);
- }
- }));
- }
- }
- }
-
- private void doTriggerActions(@Nullable Player player, @NotNull SimpleLocation crop_loc, ItemMode itemMode) {
- if (triggerAction) {
- StageConfig stageConfig = CustomCrops.getInstance().getCropManager().getStageConfig(stageID);
- if (stageConfig != null) {
- Action[] actions = stageConfig.getBreakActions();
- if (actions != null) {
- for (Action action : actions) {
- action.doOn(player, crop_loc, itemMode);
- }
- }
- }
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ChainImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ChainImpl.java
deleted file mode 100644
index bc8f7ed..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ChainImpl.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.requirement.CurrentState;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public class ChainImpl implements Action {
-
- private final Action[] actions;
- private final double chance;
- private final Requirement[] requirements;
-
- public ChainImpl(Action[] actions, Requirement[] requirements, double chance) {
- this.actions = actions;
- this.requirements = requirements;
- this.chance = chance;
- }
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (Math.random() < chance) {
- if (requirements != null && player != null) {
- var state = new CurrentState(cropLoc == null ? player.getLocation() : cropLoc.getBukkitLocation(), player);
- for (Requirement requirement : requirements) {
- if (!requirement.isConditionMet(state)) {
- return;
- }
- }
- }
- for (Action action : actions) {
- action.doOn(player, cropLoc, itemMode);
- }
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/CommandActionImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/CommandActionImpl.java
deleted file mode 100644
index 381f117..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/CommandActionImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Bukkit;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record CommandActionImpl(String[] commands, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- for (String command : commands) {
- Bukkit.getServer().dispatchCommand(Bukkit.getConsoleSender(),
- command.replace("{player}", player.getName())
- .replace("{x}", cropLoc == null ? "" : String.valueOf(cropLoc.getX()))
- .replace("{y}", cropLoc == null ? "" : String.valueOf(cropLoc.getY()))
- .replace("{z}", cropLoc == null ? "" : String.valueOf(cropLoc.getZ()))
- .replace("{world}", player.getWorld().getName())
- );
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/DropItemImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/DropItemImpl.java
deleted file mode 100644
index bc4f441..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/DropItemImpl.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.loot.Loot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record DropItemImpl(Loot[] loots, boolean toInv) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (cropLoc == null) return;
- if (player != null) {
- for (Loot loot : loots) {
- loot.drop(player, cropLoc.getBukkitLocation(), toInv);
- }
- } else {
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- for (Loot loot : loots) {
- loot.drop(null, cropLoc.getBukkitLocation(), toInv);
- }
- });
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/GiveMoneyImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/GiveMoneyImpl.java
deleted file mode 100644
index f050014..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/GiveMoneyImpl.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.integration.VaultHook;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record GiveMoneyImpl(double money, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player != null && Math.random() < chance) {
- VaultHook vaultHook = CustomCrops.getInstance().getIntegrationManager().getVault();
- if (vaultHook != null) {
- vaultHook.getEconomy().depositPlayer(player, money);
- }
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/JobXPImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/JobXPImpl.java
deleted file mode 100644
index d246600..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/JobXPImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.integration.JobInterface;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record JobXPImpl(double amount, double chance, @Nullable String job) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- JobInterface jobInterface = CustomCrops.getInstance().getIntegrationManager().getJobInterface();
- if (jobInterface == null) return;
- jobInterface.addXp(player, amount, job);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/MessageActionImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/MessageActionImpl.java
deleted file mode 100644
index 75c4a56..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/MessageActionImpl.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record MessageActionImpl(String[] messages, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- for (String message : messages) {
- AdventureUtils.playerMessage(player,
- message.replace("{player}", player.getName())
- .replace("{world}", player.getWorld().getName())
- .replace("{x}", cropLoc == null ? "" : String.valueOf(cropLoc.getX()))
- .replace("{y}", cropLoc == null ? "" : String.valueOf(cropLoc.getY()))
- .replace("{z}", cropLoc == null ? "" : String.valueOf(cropLoc.getZ()))
- );
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ParticleImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ParticleImpl.java
deleted file mode 100644
index 05f216f..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ParticleImpl.java
+++ /dev/null
@@ -1,46 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Location;
-import org.bukkit.Particle;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public class ParticleImpl implements Action {
-
- private final Particle particle;
- private final int amount;
- private final double offset;
-
- public ParticleImpl(Particle particle, int amount, double offset) {
- this.particle = particle;
- this.amount = amount;
- this.offset = offset;
- }
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (cropLoc == null) return;
- Location location = cropLoc.getBukkitLocation();
- if (location == null) return;
- location.getWorld().spawnParticle(particle, location.clone().add(0.5,0.5,0.5), amount, offset, offset, offset);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/PotionEffectImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/PotionEffectImpl.java
deleted file mode 100644
index 317dd87..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/PotionEffectImpl.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.entity.Player;
-import org.bukkit.potion.PotionEffect;
-import org.jetbrains.annotations.Nullable;
-
-public record PotionEffectImpl(PotionEffect potionEffect, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- player.addPotionEffect(potionEffect);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ReplantImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ReplantImpl.java
deleted file mode 100644
index 1177c9b..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/ReplantImpl.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.event.CropPlantEvent;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.basic.MessageManager;
-import net.momirealms.customcrops.api.object.crop.CropConfig;
-import net.momirealms.customcrops.api.object.crop.GrowingCrop;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.Chunk;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.concurrent.CompletableFuture;
-
-public class ReplantImpl implements Action {
-
- private final int point;
- private final String crop;
- private final String model;
-
- public ReplantImpl(int point, String model, String crop) {
- this.point = point;
- this.crop = crop;
- this.model = model;
- }
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (cropLoc == null) return;
- CropConfig cropConfig = CustomCrops.getInstance().getCropManager().getCropConfigByID(crop);
- if (cropConfig != null) {
- Location location = cropLoc.getBukkitLocation();
- if (location == null) return;
- ItemMode newCMode = cropConfig.getCropMode();
- if (ConfigManager.enableLimitation && CustomCrops.getInstance().getWorldDataManager().getChunkCropAmount(cropLoc) >= ConfigManager.maxCropPerChunk) {
- AdventureUtils.playerMessage(player, MessageManager.prefix + MessageManager.reachChunkLimit);
- return;
- }
- if (player != null) {
- CropPlantEvent cropPlantEvent = new CropPlantEvent(player, player.getInventory().getItemInMainHand(), location, crop, point, model);
- Bukkit.getPluginManager().callEvent(cropPlantEvent);
- if (cropPlantEvent.isCancelled()) {
- return;
- }
- if (!CustomCrops.getInstance().getPlatformInterface().detectAnyThing(location)) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, model, newCMode);
- CustomCrops.getInstance().getWorldDataManager().addCropData(cropLoc, new GrowingCrop(crop, point), true);
- }
- } else {
- CompletableFuture asyncGetChunk = location.getWorld().getChunkAtAsync(location.getBlockX() >> 4, location.getBlockZ() >> 4);
- if (itemMode == ItemMode.ITEM_FRAME || itemMode == ItemMode.ITEM_DISPLAY) {
- CompletableFuture loadEntities = asyncGetChunk.thenApply((chunk) -> {
- chunk.getEntities();
- return chunk.isEntitiesLoaded();
- });
- loadEntities.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- if (!CustomCrops.getInstance().getPlatformInterface().detectAnyThing(location)) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, model, newCMode);
- CustomCrops.getInstance().getWorldDataManager().addCropData(cropLoc, new GrowingCrop(crop, point), true);
- }
- }));
- } else {
- asyncGetChunk.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- if (!CustomCrops.getInstance().getPlatformInterface().detectAnyThing(location)) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, model, newCMode);
- CustomCrops.getInstance().getWorldDataManager().addCropData(cropLoc, new GrowingCrop(crop, point), true);
- }
- }));
- }
- }
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SkillXPImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SkillXPImpl.java
deleted file mode 100644
index cb7f11f..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SkillXPImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.integration.SkillInterface;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record SkillXPImpl(double amount, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- SkillInterface skillInterface = CustomCrops.getInstance().getIntegrationManager().getSkillInterface();
- if (skillInterface == null) return;
- skillInterface.addXp(player, amount);
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SoundActionImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SoundActionImpl.java
deleted file mode 100644
index 49fafd6..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SoundActionImpl.java
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.kyori.adventure.key.Key;
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.Locale;
-
-public record SoundActionImpl(String source, String sound, float volume, float pitch) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null) return;
- AdventureUtils.playerSound(player, Sound.Source.valueOf(source.toUpperCase(Locale.ENGLISH)), Key.key(sound), volume, pitch);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SwingHandImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SwingHandImpl.java
deleted file mode 100644
index 73c9146..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/SwingHandImpl.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public class SwingHandImpl implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player != null) {
- player.swingMainHand();
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VanillaXPImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VanillaXPImpl.java
deleted file mode 100644
index 0200651..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VanillaXPImpl.java
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.kyori.adventure.key.Key;
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public record VanillaXPImpl(int amount, boolean mending, double chance) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (player == null || Math.random() > chance) return;
- player.giveExp(amount, mending);
- AdventureUtils.playerSound(player, Sound.Source.PLAYER, Key.key("minecraft:entity.experience_orb.pickup"), 1, 1);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VariationImpl.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VariationImpl.java
deleted file mode 100644
index a16cd37..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/action/VariationImpl.java
+++ /dev/null
@@ -1,94 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.action;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.crop.VariationCrop;
-import net.momirealms.customcrops.api.object.fertilizer.Variation;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Chunk;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.concurrent.CompletableFuture;
-
-public record VariationImpl(VariationCrop[] variationCrops) implements Action {
-
- @Override
- public void doOn(@Nullable Player player, @Nullable SimpleLocation cropLoc, ItemMode itemMode) {
- if (cropLoc == null) return;
- double bonus = 0;
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(cropLoc.add(0,-1,0));
- if (pot != null && CustomCrops.getInstance().getFertilizerManager().getConfigByFertilizer(pot.getFertilizer()) instanceof Variation variation) {
- bonus = variation.getChance();
- }
- for (VariationCrop variationCrop : variationCrops) {
- if (Math.random() < variationCrop.getChance() + bonus) {
- doVariation(cropLoc, itemMode, variationCrop);
- break;
- }
- }
- }
-
- public boolean doOn(@Nullable SimpleLocation crop_loc, ItemMode itemMode) {
- if (crop_loc == null) return false;
- double bonus = 0;
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(crop_loc.add(0,-1,0));
- if (pot != null && CustomCrops.getInstance().getFertilizerManager().getConfigByFertilizer(pot.getFertilizer()) instanceof Variation variation) {
- bonus = variation.getChance();
- }
- for (VariationCrop variationCrop : variationCrops) {
- if (Math.random() < variationCrop.getChance() + bonus) {
- doVariation(crop_loc, itemMode, variationCrop);
- return true;
- }
- }
- return false;
- }
-
- private void doVariation(@NotNull SimpleLocation crop_loc, ItemMode itemMode, VariationCrop variationCrop) {
- Location location = crop_loc.getBukkitLocation();
- if (location == null) return;
- CompletableFuture asyncGetChunk = location.getWorld().getChunkAtAsync(location.getBlockX() >> 4, location.getBlockZ() >> 4);
- if (itemMode == ItemMode.ITEM_FRAME || itemMode == ItemMode.ITEM_DISPLAY) {
- CompletableFuture loadEntities = asyncGetChunk.thenApply((chunk) -> {
- chunk.getEntities();
- return chunk.isEntitiesLoaded();
- });
- loadEntities.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().callSyncMethod(() -> {
- if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode)) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, variationCrop.getId(), variationCrop.getCropMode());
- }
- return null;
- }));
- } else {
- asyncGetChunk.whenComplete((result, throwable) ->
- CustomCrops.getInstance().getScheduler().callSyncMethod(() -> {
- if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode)) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, variationCrop.getId(), variationCrop.getCropMode());
- }
- return null;
- }));
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java
deleted file mode 100644
index 2a3ab5e..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/ConfigManager.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.basic;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.Function;
-import net.momirealms.customcrops.util.AdventureUtils;
-import net.momirealms.customcrops.util.ConfigUtils;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Objects;
-
-public class ConfigManager extends Function {
-
- public static String lang;
- public static boolean enableBStats;
- public static boolean checkUpdate;
- public static boolean enableSkillBonus;
- public static String bonusFormula;
- public static int greenhouseRange;
- public static boolean whiteListWorlds;
- public static HashSet worldList;
- public static String worldFolderPath;
- public static boolean debugScheduler;
- public static boolean debugCorruption;
- public static String greenhouseBlock;
- public static String scarecrow;
- public static boolean enableGreenhouse;
- public static int pointGainInterval;
- public static int corePoolSize;
- public static double[] defaultRatio;
- public static int maxPoolSize;
- public static long keepAliveTime;
- public static int seasonInterval;
- public static boolean enableSeason;
- public static boolean rsHook;
- public static boolean enableScheduleSystem;
- public static boolean syncSeason;
- public static boolean autoSeasonChange;
- public static String referenceWorld;
- public static boolean enableLimitation;
- public static int maxCropPerChunk;
- public static int cacheSaveInterval;
- public static int intervalConsume;
- public static int intervalWork;
- public static int fixRange;
- public static boolean disableMoistureMechanic;
- public static boolean preventTrampling;
- public static boolean onlyInLoadedChunks;
- public static boolean enableCorruptionFixer;
- public static boolean debugWorld;
- public static boolean updateDuringLoading;
-
- private final HashMap cropPerWorld;
- private final CustomCrops plugin;
-
- public ConfigManager(CustomCrops plugin) {
- this.plugin = plugin;
- this.cropPerWorld = new HashMap<>();
- YamlConfiguration config = ConfigUtils.getConfig("config.yml");
- onlyInLoadedChunks = config.getBoolean("mechanics.only-work-in-loaded-chunks", false);
- }
-
- @Override
- public void load() {
- this.loadConfig();
- }
-
- @Override
- public void unload() {
- this.cropPerWorld.clear();
- }
-
- private void loadConfig() {
- if (new File(plugin.getDataFolder(), "config.yml").exists()) ConfigUtils.update("config.yml");
- YamlConfiguration config = ConfigUtils.getConfig("config.yml");
- enableBStats = config.getBoolean("metrics");
- lang = config.getString("lang");
- debugScheduler = config.getBoolean("debug.log-scheduler", false);
- debugCorruption = config.getBoolean("debug.log-corruption-fixer", false);
- debugWorld = config.getBoolean("debug.log-world-state", false);
- loadWorlds(Objects.requireNonNull(config.getConfigurationSection("worlds")));
- loadScheduleSystem(Objects.requireNonNull(config.getConfigurationSection("schedule-system")));
- loadMechanic(Objects.requireNonNull(config.getConfigurationSection("mechanics")));
- loadOtherSetting(Objects.requireNonNull(config.getConfigurationSection("other-settings")));
- loadOptimization(Objects.requireNonNull(config.getConfigurationSection("optimization")));
- }
-
- private void loadOptimization(ConfigurationSection section) {
- enableLimitation = section.getBoolean("limitation.growing-crop-amount.enable", true);
- maxCropPerChunk = section.getInt("limitation.growing-crop-amount.default", 64);
- updateDuringLoading = !ConfigManager.onlyInLoadedChunks && section.getBoolean("only-update-during-chunk-loading", false);
- List worldSettings = section.getStringList("limitation.growing-crop-amount.worlds");
- for (String setting : worldSettings) {
- String[] split = setting.split(":", 2);
- try {
- cropPerWorld.put(split[0], Integer.parseInt(split[1]));
- } catch (NumberFormatException e) {
- AdventureUtils.consoleMessage("[CustomCrops] Wrong number format found at: optimization.limitation.growing-crop-amount.worlds in config.yml");
- }
- }
- }
-
- private void loadWorlds(ConfigurationSection section) {
- worldFolderPath = section.getString("absolute-world-folder-path", "");
- whiteListWorlds = section.getString("mode", "whitelist").equalsIgnoreCase("whitelist");
- worldList = new HashSet<>(section.getStringList("list"));
- }
-
- private void loadScheduleSystem(ConfigurationSection section) {
- enableScheduleSystem = section.getBoolean("enable", true);
- pointGainInterval = section.getInt("point-gain-interval", 600);
- corePoolSize = section.getInt("thread-pool-settings.corePoolSize", 2);
- maxPoolSize = section.getInt("thread-pool-settings.maximumPoolSize", 4);
- keepAliveTime = section.getInt("thread-pool-settings.keepAliveTime", 10);
- cacheSaveInterval = section.getInt("cache-save-interval", 12000);
- intervalConsume = section.getInt("consume-water-fertilizer-every-x-point", 2);
- intervalWork = section.getInt("sprinkler-work-every-x-point", 2);
- }
-
- private void loadMechanic(ConfigurationSection section) {
- defaultRatio = ConfigUtils.getQualityRatio(section.getString("default-quality-ratio", "17/2/1"));
- enableSeason = section.getBoolean("season.enable", true);
- syncSeason = section.getBoolean("season.sync-season.enable", false);
- referenceWorld = section.getString("season.sync-season.reference");
- autoSeasonChange = section.getBoolean("season.auto-season-change.enable");
- seasonInterval = section.getInt("season.auto-season-change.duration", 28);
- enableGreenhouse = section.getBoolean("season.greenhouse.enable", true);
- greenhouseRange = section.getInt("season.greenhouse.range", 5);
- greenhouseBlock = section.getString("season.greenhouse.block");
- scarecrow = section.getString("scarecrow");
- disableMoistureMechanic = section.getBoolean("vanilla-farmland.disable-moisture-mechanic", false);
- preventTrampling = section.getBoolean("vanilla-farmland.prevent-trampling", false);
- }
-
- private void loadOtherSetting(ConfigurationSection section) {
- enableSkillBonus = section.getBoolean("skill-bonus.enable", false);
- bonusFormula = section.getString("skill-bonus.formula");
- enableCorruptionFixer = section.getBoolean("enable-corruption-fixer", true);
- fixRange = section.getInt("corrupt-fix-range", 4);
- }
-
- public int getCropLimit(String world) {
- return Objects.requireNonNullElse(cropPerWorld.get(world), maxCropPerChunk);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/MessageManager.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/MessageManager.java
deleted file mode 100644
index ea36924..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/basic/MessageManager.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.basic;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.Function;
-import net.momirealms.customcrops.util.ConfigUtils;
-import org.bukkit.configuration.file.YamlConfiguration;
-
-import java.io.File;
-
-public class MessageManager extends Function {
-
- private CustomCrops plugin;
-
- public static String prefix;
- public static String reload;
- public static String unavailableArgs;
- public static String noConsole;
- public static String notOnline;
- public static String lackArgs;
- public static String nonArgs;
- public static String beforePlant;
- public static String unsuitablePot;
- public static String reachChunkLimit;
- public static String spring;
- public static String summer;
- public static String autumn;
- public static String winter;
- public static String noPerm;
- public static String noSeason;
- public static String setSeason;
- public static String setDate;
- public static String worldNotExist;
- public static String seasonNotExist;
- public static String forceWork;
- public static String forceConsume;
- public static String forceGrow;
-
- public MessageManager(CustomCrops plugin) {
- this.plugin =plugin;
- }
-
- @Override
- public void load() {
- this.loadMessage();
- }
-
- private void loadMessage() {
- YamlConfiguration config = ConfigUtils.getConfig("messages" + File.separator + "messages_" + ConfigManager.lang + ".yml");
- prefix = config.getString("messages.prefix","[CustomCrops] ");
- reload = config.getString("messages.reload", "Reloaded! Took {time}ms.");
- unavailableArgs = config.getString("messages.invalid-args", "Invalid arguments.");
- noConsole = config.getString("messages.no-console", "This command can only be executed by a player.");
- notOnline = config.getString("messages.not-online", "Player {player} is not online.");
- lackArgs = config.getString("messages.lack-args", "Arguments are insufficient.");
- nonArgs = config.getString("messages.not-none-args", "Not a none argument command.");
- beforePlant = config.getString("messages.before-plant", "This fertilizer can only be used before planting.");
- unsuitablePot = config.getString("messages.unsuitable-pot", "You can't plant the seed in this pot.");
- reachChunkLimit = config.getString("messages.reach-crop-limit", "The number of crops has reached the limitation.");
- noPerm = config.getString("messages.no-perm", "You don't have permission to do that.");
- spring = config.getString("messages.spring", "Spring");
- summer = config.getString("messages.summer", "Summer");
- autumn = config.getString("messages.autumn", "Autumn");
- winter = config.getString("messages.winter", "Winter");
- noSeason = config.getString("messages.no-season", "SEASON DISABLED IN THIS WORLD");
- setSeason = config.getString("messages.set-season", "Successfully set {world}'s season to {season}.");
- setDate = config.getString("messages.set-date", "Successfully set {world}'s date to {date}.");
- worldNotExist = config.getString("messages.world-not-exist", "World {world} does not exist.");
- seasonNotExist = config.getString("messages.season-not-exist", "Season {season} does not exist.");
- forceWork = config.getString("messages.force-sprinkler-work", "Forced {world}'s sprinklers to work.");
- forceConsume = config.getString("messages.force-consume", "Forced {world}'s pots to reduce water amount and the remaining use of fertilizers.");
- forceGrow = config.getString("messages.force-grow", "Forced {world}'s crops to grow one point.");
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/AndCondition.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/AndCondition.java
deleted file mode 100644
index 9cbb49d..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/AndCondition.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-
-import java.util.List;
-
-public class AndCondition implements Condition {
-
- private final List deathConditions;
-
- public AndCondition(List deathConditions) {
- this.deathConditions = deathConditions;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- for (Condition condition : deathConditions) {
- if (!condition.isMet(simpleLocation)) {
- return false;
- }
- }
- return true;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/CrowAttack.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/CrowAttack.java
deleted file mode 100644
index 1758a9a..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/CrowAttack.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.CrowTask;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Bukkit;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-
-public class CrowAttack implements Condition {
-
- private final double chance;
- private final String fly_model;
- private final String stand_model;
-
- public CrowAttack(double chance, String fly_model, String stand_model) {
- this.chance = chance;
- this.fly_model = fly_model;
- this.stand_model = stand_model;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- if (Math.random() > chance) return false;
- if (CustomCrops.getInstance().getWorldDataManager().hasScarecrow(simpleLocation)) return false;
- Location location = simpleLocation.getBukkitLocation();
- if (location == null) return false;
- for (Player player : Bukkit.getOnlinePlayers()) {
- SimpleLocation playerLoc = SimpleLocation.getByBukkitLocation(player.getLocation());
- if (playerLoc.isNear(simpleLocation, 48)) {
- new CrowTask(player, location, fly_model, stand_model).runTaskTimerAsynchronously(CustomCrops.getInstance(), 1, 1);
- }
- }
- return true;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java
deleted file mode 100644
index b144f40..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/DeathCondition.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.ItemType;
-import net.momirealms.customcrops.api.object.OfflineReplaceTask;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.Chunk;
-import org.bukkit.Location;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.concurrent.CompletableFuture;
-
-public class DeathCondition {
-
- private final String dead_model;
- private final Condition[] conditions;
-
- public DeathCondition(@Nullable String dead_model, @NotNull Condition[] conditions) {
- this.dead_model = dead_model;
- this.conditions = conditions;
- }
-
- public boolean checkIfDead(SimpleLocation simpleLocation) {
- for (Condition condition : conditions) {
- if (condition.isMet(simpleLocation)) {
- return true;
- }
- }
- return false;
- }
-
- public void applyDeadModel(SimpleLocation simpleLocation, ItemMode itemMode) {
- Location location = simpleLocation.getBukkitLocation();
- if (location == null) return;
-
- if (location.getWorld().isChunkLoaded(simpleLocation.getX() >> 4, simpleLocation.getZ() >> 4)) {
- replaceDeadModels(location, itemMode);
- return;
- }
-
- if (ConfigManager.updateDuringLoading) {
- CustomCrops.getInstance().getWorldDataManager().addOfflineTask(simpleLocation, new OfflineReplaceTask(dead_model, ItemType.CROP, itemMode));
- return;
- }
-
- CompletableFuture asyncGetChunk = location.getWorld().getChunkAtAsync(location.getBlockX() >> 4, location.getBlockZ() >> 4);
- if (itemMode == ItemMode.ITEM_FRAME || itemMode == ItemMode.ITEM_DISPLAY) {
- CompletableFuture loadEntities = asyncGetChunk.thenApply((chunk) -> {
- chunk.getEntities();
- return chunk.isEntitiesLoaded();
- });
- loadEntities.whenComplete((result, throwable) -> replaceDeadModels(location, itemMode));
- } else {
- asyncGetChunk.whenComplete((result, throwable) -> replaceDeadModels(location, itemMode));
- }
- }
-
- private void replaceDeadModels(Location location, ItemMode itemMode) {
- CustomCrops.getInstance().getScheduler().runTask(() -> {
- if (CustomCrops.getInstance().getPlatformInterface().removeCustomItem(location, itemMode)) {
- if (dead_model != null) {
- CustomCrops.getInstance().getPlatformInterface().placeCustomItem(location, dead_model, itemMode);
- }
- }
- });
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/OrCondition.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/OrCondition.java
deleted file mode 100644
index 6730454..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/OrCondition.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-
-import java.util.List;
-
-public class OrCondition implements Condition {
-
- private final List deathConditions;
-
- public OrCondition(List deathConditions) {
- this.deathConditions = deathConditions;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- for (Condition condition : deathConditions) {
- if (condition.isMet(simpleLocation)) {
- return true;
- }
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/RightSeason.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/RightSeason.java
deleted file mode 100644
index 61bee3a..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/RightSeason.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.season.CCSeason;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.api.object.world.WorldDataManager;
-
-public class RightSeason implements Condition {
-
- private final CCSeason[] seasons;
-
- public RightSeason(CCSeason[] seasons) {
- this.seasons = seasons;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- String world = simpleLocation.getWorldName();
- CCSeason current = CustomCrops.getInstance().getIntegrationManager().getSeasonInterface().getSeason(world);
- for (CCSeason allowed : seasons) {
- if (current == allowed) {
- return true;
- }
- }
- WorldDataManager worldDataManager = CustomCrops.getInstance().getWorldDataManager();
- if (ConfigManager.enableGreenhouse) {
- for (int i = 0; i < ConfigManager.greenhouseRange; i++) {
- if (worldDataManager.isGreenhouse(simpleLocation.add(0, i, 0))) {
- return true;
- }
- }
- }
- return false;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterLessThan.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterLessThan.java
deleted file mode 100644
index 1154c8b..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterLessThan.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-
-public class WaterLessThan implements Condition {
-
- private final int amount;
-
- public WaterLessThan(int amount) {
- this.amount = amount;
- }
-
- @Override
- public boolean isMet(SimpleLocation crop_loc) {
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(crop_loc.add(0,-1,0));
- if (pot == null) return true;
- return pot.getWater() < amount;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterMoreThan.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterMoreThan.java
deleted file mode 100644
index 67c6874..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WaterMoreThan.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-
-public class WaterMoreThan implements Condition {
-
- private final int amount;
-
- public WaterMoreThan(int amount) {
- this.amount = amount;
- }
-
- @Override
- public boolean isMet(SimpleLocation crop_loc) {
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(crop_loc.add(0,-1,0));
- if (pot == null) return false;
- return pot.getWater() > amount;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Weather.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Weather.java
deleted file mode 100644
index e6f2851..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/Weather.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import org.bukkit.World;
-
-public class Weather implements Condition {
-
- private final String[] weathers;
-
- public Weather(String[] weathers) {
- this.weathers = weathers;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- World world = simpleLocation.getBukkitWorld();
- if (world == null) return false;
- String currentWeather;
- if (world.isThundering()) currentWeather = "thunder";
- else if (world.isClearWeather()) currentWeather = "clear";
- else currentWeather = "rain";
- for (String weather : weathers) {
- if (weather.equals(currentWeather)) {
- return true;
- }
- }
- return false;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WrongSeason.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WrongSeason.java
deleted file mode 100644
index 10c62fc..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/condition/WrongSeason.java
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.condition;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.season.CCSeason;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.api.object.world.WorldDataManager;
-
-public class WrongSeason implements Condition {
-
- private final CCSeason[] seasons;
-
- public WrongSeason(CCSeason[] seasons) {
- this.seasons = seasons;
- }
-
- @Override
- public boolean isMet(SimpleLocation simpleLocation) {
- String world = simpleLocation.getWorldName();
- CCSeason current = CustomCrops.getInstance().getIntegrationManager().getSeasonInterface().getSeason(world);
- for (CCSeason bad : seasons) {
- if (current == bad) {
- WorldDataManager worldDataManager = CustomCrops.getInstance().getWorldDataManager();
- if (ConfigManager.enableGreenhouse) {
- for (int i = 0; i < ConfigManager.greenhouseRange; i++) {
- if (worldDataManager.isGreenhouse(simpleLocation.add(0, i, 0))) {
- return false;
- }
- }
- }
- return true;
- }
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropConfig.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropConfig.java
deleted file mode 100644
index 198e53c..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropConfig.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.crop;
-
-import net.momirealms.customcrops.api.object.BoneMeal;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.action.Action;
-import net.momirealms.customcrops.api.object.condition.Condition;
-import net.momirealms.customcrops.api.object.condition.DeathCondition;
-import net.momirealms.customcrops.api.object.requirement.CurrentState;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.HashMap;
-
-public class CropConfig {
-
- private final String key;
- private final ItemMode itemMode;
- private final String[] bottom_blocks;
- private final int max_points;
- private final HashMap stageMap;
- private final Requirement[] plantRequirements;
- private final Requirement[] breakRequirements;
- private final DeathCondition[] deathConditions;
- private final Condition[] growConditions;
- private final BoneMeal[] boneMeals;
- private final Action[] plantActions;
- private final boolean rotation;
-
- public CropConfig(
- String key,
- ItemMode itemMode,
- int max_points,
- String[] bottom_blocks,
- Requirement[] plantRequirements,
- Requirement[] breakRequirements,
- DeathCondition[] deathConditions,
- Condition[] growConditions,
- HashMap stageMap,
- BoneMeal[] boneMeals,
- Action[] plantActions,
- boolean rotation
- ) {
- this.key = key;
- this.itemMode = itemMode;
- this.deathConditions = deathConditions;
- this.plantRequirements = plantRequirements;
- this.breakRequirements = breakRequirements;
- this.max_points = max_points;
- this.bottom_blocks = bottom_blocks;
- this.stageMap = stageMap;
- this.growConditions = growConditions;
- this.boneMeals = boneMeals;
- this.plantActions = plantActions;
- this.rotation = rotation;
- }
-
- public String getKey() {
- return key;
- }
-
- @NotNull
- public ItemMode getCropMode() {
- return itemMode;
- }
-
- @Nullable
- public StageConfig getStageConfig(int stage) {
- return stageMap.get(stage);
- }
-
- @NotNull
- public String[] getPotWhitelist() {
- return bottom_blocks;
- }
-
- public int getMaxPoints() {
- return max_points;
- }
-
- @Nullable
- public Requirement[] getPlantRequirements() {
- return plantRequirements;
- }
-
- @Nullable
- public Requirement[] getBreakRequirements() {
- return breakRequirements;
- }
-
- @Nullable
- public DeathCondition[] getDeathConditions() {
- return deathConditions;
- }
-
- @Nullable
- public Condition[] getGrowConditions() {
- return growConditions;
- }
-
- @Nullable
- public BoneMeal[] getBoneMeals() {
- return boneMeals;
- }
-
- @Nullable
- public Action[] getPlantActions() {
- return plantActions;
- }
-
- public boolean isRotationEnabled() {
- return rotation;
- }
-
- public boolean canPlant(Player player, Location location) {
- if (plantRequirements == null) return true;
- CurrentState currentState = new CurrentState(location, player);
- for (Requirement requirement : plantRequirements) {
- if (!requirement.isConditionMet(currentState)) {
- return false;
- }
- }
- return true;
- }
-
- public boolean canBreak(Player player, Location location) {
- if (breakRequirements == null) return true;
- CurrentState currentState = new CurrentState(location, player);
- for (Requirement requirement : breakRequirements) {
- if (!requirement.isConditionMet(currentState)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropManager.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropManager.java
deleted file mode 100644
index d5a1e2b..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/CropManager.java
+++ /dev/null
@@ -1,251 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.crop;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.Function;
-import net.momirealms.customcrops.api.object.InteractCrop;
-import net.momirealms.customcrops.api.object.ItemMode;
-import net.momirealms.customcrops.api.object.condition.Condition;
-import net.momirealms.customcrops.api.object.condition.DeathCondition;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import net.momirealms.customcrops.customplugin.Platform;
-import net.momirealms.customcrops.util.AdventureUtils;
-import net.momirealms.customcrops.util.ConfigUtils;
-import org.bukkit.Bukkit;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.FileConfiguration;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.bukkit.entity.Item;
-import org.bukkit.event.EventHandler;
-import org.bukkit.event.HandlerList;
-import org.bukkit.event.Listener;
-import org.bukkit.event.entity.ItemSpawnEvent;
-import org.bukkit.plugin.Plugin;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Locale;
-
-public class CropManager extends Function implements Listener {
-
- private final CustomCrops plugin;
- private final HashMap stageToCrop;
- private final HashMap seedToCropConfig;
- private final HashMap cropConfigMap;
- private final HashMap stageConfigMap;
- private final HashSet deadCrops;
- private boolean hasCheckedTripwire;
-
- public CropManager(CustomCrops plugin) {
- this.plugin = plugin;
- this.stageToCrop = new HashMap<>();
- this.cropConfigMap = new HashMap<>();
- this.stageConfigMap = new HashMap<>();
- this.seedToCropConfig = new HashMap<>();
- this.deadCrops = new HashSet<>();
- }
-
- @Override
- public void load() {
- this.loadConfig();
- Bukkit.getPluginManager().registerEvents(this, plugin);
- }
-
- @Override
- public void unload() {
- this.stageToCrop.clear();
- this.cropConfigMap.clear();
- this.stageConfigMap.clear();
- this.deadCrops.clear();
- this.seedToCropConfig.clear();
- HandlerList.unregisterAll(this);
- }
-
- private void loadConfig() {
- File crop_folder = new File(plugin.getDataFolder(), "contents" + File.separator + "crops");
- if (!crop_folder.exists()) {
- if (!crop_folder.mkdirs()) return;
- ConfigUtils.getConfig("contents" + File.separator + "crops" + File.separator + "tomato.yml");
- }
- File[] files = crop_folder.listFiles();
- if (files == null) return;
- for (File file : files) {
- YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
- for (String key : config.getKeys(false)) {
- ConfigurationSection cropSec = config.getConfigurationSection(key);
- if (cropSec == null) continue;
- ItemMode itemMode = ItemMode.valueOf(cropSec.getString("type", "TripWire").toUpperCase(Locale.ENGLISH));
- if (itemMode == ItemMode.TRIPWIRE && !hasCheckedTripwire) {
- checkTripwire();
- }
- String[] bottomBlocks = cropSec.getStringList("pot-whitelist").toArray(new String[0]);
- if (bottomBlocks.length == 0) {
- AdventureUtils.consoleMessage("[CustomCrops] pot-whitelist is not set for crop: " + key);
- continue;
- }
-
- String seed = cropSec.getString("seed");
- Requirement[] breakReq = ConfigUtils.getRequirementsWithMsg(cropSec.getConfigurationSection("requirements.break"));
- Requirement[] plantReq = ConfigUtils.getRequirementsWithMsg(cropSec.getConfigurationSection("requirements.plant"));
-
- int max = cropSec.getInt("max-points", 0);
- ConfigurationSection pointSec = cropSec.getConfigurationSection("points");
- if (pointSec == null || max == 0) {
- AdventureUtils.consoleMessage("[CustomCrops] Points are not set for crop: " + key);
- continue;
- }
- HashMap stageMap = new HashMap<>();
- for (String point : pointSec.getKeys(false)) {
- try {
- int parsed = Integer.parseInt(point);
- String stageModel = pointSec.getString(point + ".model");
- StageConfig stageConfig = new StageConfig(
- parsed,
- stageModel,
- ConfigUtils.getActions(pointSec.getConfigurationSection(point + ".events.break"), stageModel),
- ConfigUtils.getActions(pointSec.getConfigurationSection(point + ".events.grow"), stageModel),
- ConfigUtils.getInteractActions(pointSec.getConfigurationSection(point + ".events.interact-with-item"), stageModel),
- pointSec.contains(point + ".events.interact-by-hand") ? new InteractCrop(
- "AIR",
- false,
- null,
- ConfigUtils.getActions(pointSec.getConfigurationSection(point + ".events.interact-by-hand"), stageModel),
- ConfigUtils.getRequirementsWithMsg(pointSec.getConfigurationSection(point + ".events.interact-by-hand.requirements"))
- ) : null,
- pointSec.getDouble(point + ".hologram-offset-correction", 0d)
- );
- stageMap.put(parsed, stageConfig);
- if (stageModel != null) {
- stageToCrop.put(stageModel, key);
- stageConfigMap.put(stageModel, stageConfig);
- }
- }
- catch (NumberFormatException e) {
- AdventureUtils.consoleMessage("[CustomCrops] Unexpected point value: " + point);
- }
- }
- DeathCondition[] deathConditions = ConfigUtils.getDeathConditions(cropSec.getConfigurationSection("death-conditions"));
- Condition[] growConditions = ConfigUtils.getConditions(cropSec.getConfigurationSection("grow-conditions"));
- CropConfig cropConfig = new CropConfig(
- key,
- itemMode,
- max,
- bottomBlocks,
- plantReq,
- breakReq,
- deathConditions,
- growConditions,
- stageMap,
- ConfigUtils.getBoneMeals(cropSec.getConfigurationSection("custom-bone-meal")),
- ConfigUtils.getActions(cropSec.getConfigurationSection("plant-actions"), null),
- cropSec.getBoolean("random-rotation", false)
- );
- cropConfigMap.put(key, cropConfig);
- if (seed != null) seedToCropConfig.put(seed, cropConfig);
- }
- }
- AdventureUtils.consoleMessage("[CustomCrops] Loaded " + cropConfigMap.size() + " crop(s)");
- }
-
- @Nullable
- public StageConfig getStageConfig(String stage_id) {
- return stageConfigMap.get(stage_id);
- }
-
- @Nullable
- public CropConfig getCropConfigByID(String id) {
- return this.cropConfigMap.get(id);
- }
-
- @Nullable
- public CropConfig getCropConfigByStage(String stage_id) {
- String key = getCropConfigID(stage_id);
- if (key == null) return null;
- return this.cropConfigMap.get(key);
- }
-
- @Nullable
- public String getCropConfigID(String stage_id) {
- return this.stageToCrop.get(stage_id);
- }
-
- public boolean isDeadCrop(String id) {
- return deadCrops.contains(id);
- }
-
- public boolean containsStage(String stage_id) {
- return stageToCrop.containsKey(stage_id);
- }
-
- // Prevent players from getting stage model
- @EventHandler
- public void onItemSpawn(ItemSpawnEvent event) {
- if (event.isCancelled()) return;
- Item item = event.getEntity();
- String id = plugin.getPlatformInterface().getItemStackID(item.getItemStack());
- if (containsStage(id) || isDeadCrop(id)) {
- event.setCancelled(true);
- }
- }
-
- public void registerDeadCrops(String id) {
- this.deadCrops.add(id);
- }
-
- @Nullable
- public CropConfig getCropConfigBySeed(String seed) {
- return seedToCropConfig.get(seed);
- }
-
- private void checkTripwire() {
- hasCheckedTripwire = true;
- if (plugin.getPlatform() == Platform.ItemsAdder) {
- Plugin iaP = Bukkit.getPluginManager().getPlugin("ItemsAdder");
- if (iaP != null) {
- FileConfiguration config = iaP.getConfig();
- boolean disabled = config.getBoolean("blocks.disable-REAL_WIRE");
- if (disabled) {
- AdventureUtils.consoleMessage("========================[CustomCrops]=========================");
- AdventureUtils.consoleMessage(" Detected that one of your crops is using TRIPWIRE type");
- AdventureUtils.consoleMessage(" If you want to use tripwire for custom crops, please set");
- AdventureUtils.consoleMessage("\"blocks.disable-REAL_WIRE: false\" in /ItemsAdder/config.yml");
- AdventureUtils.consoleMessage(" Change this setting requires a server restart");
- AdventureUtils.consoleMessage(" If you have problems with which one to use, read the wiki.");
- AdventureUtils.consoleMessage("==============================================================");
- }
- }
- } else if (plugin.getPlatform() == Platform.Oraxen) {
- Plugin oxP = Bukkit.getPluginManager().getPlugin("Oraxen");
- if (oxP != null) {
- YamlConfiguration config = YamlConfiguration.loadConfiguration(new File(oxP.getDataFolder(), "mechanics.yml"));
- boolean disabled = !config.getBoolean("stringblock.enabled");
- if (disabled) {
- AdventureUtils.consoleMessage("========================[CustomCrops]=========================");
- AdventureUtils.consoleMessage(" Detected that one of your crops is using TRIPWIRE type");
- AdventureUtils.consoleMessage(" If you want to use tripwire for custom crops, please set");
- AdventureUtils.consoleMessage(" \"stringblock.enabled: true\" in /Oraxen/mechanics.yml");
- AdventureUtils.consoleMessage(" If you have problems with which one to use, read the wiki.");
- AdventureUtils.consoleMessage("==============================================================");
- }
- }
- }
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/GrowingCrop.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/GrowingCrop.java
deleted file mode 100644
index 0e00018..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/GrowingCrop.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.crop;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.CCGrowingCrop;
-
-import java.io.Serial;
-import java.io.Serializable;
-
-public class GrowingCrop implements Serializable, CCGrowingCrop {
-
- @Serial
- private static final long serialVersionUID = 2828962866548871991L;
-
- private int points;
- private final String crop;
-
- public GrowingCrop(String crop, int points) {
- this.points = points;
- this.crop = crop;
- }
-
- public int getPoints() {
- return points;
- }
-
- public void setPoints(int points) {
- this.points = points;
- }
-
- public String getKey() {
- return crop;
- }
-
- public CropConfig getConfig() {
- return CustomCrops.getInstance().getCropManager().getCropConfigByID(crop);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/StageConfig.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/StageConfig.java
deleted file mode 100644
index 7df283e..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/crop/StageConfig.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.crop;
-
-import net.momirealms.customcrops.api.object.InteractCrop;
-import net.momirealms.customcrops.api.object.action.Action;
-import org.jetbrains.annotations.Nullable;
-
-public class StageConfig {
-
- private final int point;
- private final String model;
- private final Action[] breakActions;
- private final InteractCrop[] interactWithItem;
- private final Action[] growActions;
- private final InteractCrop interactByHand;
- private final double offsetCorrection;
-
- public StageConfig(int point, @Nullable String model, @Nullable Action[] breakActions, @Nullable Action[] growActions, @Nullable InteractCrop[] interactWithItem, @Nullable InteractCrop interactByHand, double offsetCorrection) {
- this.point = point;
- this.breakActions = breakActions;
- this.interactWithItem = interactWithItem;
- this.growActions = growActions;
- this.interactByHand = interactByHand;
- this.model = model;
- this.offsetCorrection = offsetCorrection;
- }
-
- @Nullable
- public Action[] getBreakActions() {
- return breakActions;
- }
-
- @Nullable
- public InteractCrop[] getInteractCropWithItem() {
- return interactWithItem;
- }
-
- @Nullable
- public Action[] getGrowActions() {
- return growActions;
- }
-
- @Nullable
- public InteractCrop getInteractByHand() {
- return interactByHand;
- }
-
- @Nullable
- public String getModel() {
- return model;
- }
-
- public double getOffsetCorrection() {
- return offsetCorrection;
- }
-
- public int getPoint() {
- return point;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Fertilizer.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Fertilizer.java
deleted file mode 100644
index 9a9293b..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Fertilizer.java
+++ /dev/null
@@ -1,63 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.CCFertilizer;
-
-import java.io.Serializable;
-
-public class Fertilizer implements Serializable, CCFertilizer {
-
- private final String key;
- private int times;
-
- public Fertilizer(String key, int times) {
- this.key = key;
- this.times = times;
- }
-
- public Fertilizer(FertilizerConfig fertilizerConfig) {
- this.key = fertilizerConfig.getKey();
- this.times = fertilizerConfig.getTimes();
- }
-
- /*
- If fertilizer is used up
- */
- public boolean reduceTimes() {
- times--;
- return times <= 0;
- }
-
- public String getKey() {
- return key;
- }
-
- public FertilizerConfig getConfig() {
- return CustomCrops.getInstance().getFertilizerManager().getConfigByFertilizer(this);
- }
-
- public int getLeftTimes() {
- return times;
- }
-
- public void setTimes(int times) {
- this.times = times;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerConfig.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerConfig.java
deleted file mode 100644
index d54196f..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerConfig.java
+++ /dev/null
@@ -1,122 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.requirement.CurrentState;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import org.bukkit.Location;
-import org.bukkit.Particle;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-public abstract class FertilizerConfig {
-
- private final int times;
- private final double chance;
- private final String key;
- private final FertilizerType fertilizerType;
- private final String[] pot_whitelist;
- private final boolean beforePlant;
- private final Particle particle;
- private final Sound sound;
- private final String icon;
- private final Requirement[] requirements;
-
- public FertilizerConfig(
- String key,
- FertilizerType fertilizerType,
- int times,
- double chance,
- @Nullable String[] pot_whitelist,
- boolean beforePlant,
- @Nullable Particle particle,
- @Nullable Sound sound,
- @Nullable String icon,
- Requirement[] requirements
- ) {
- this.times = times;
- this.chance = chance;
- this.key = key;
- this.fertilizerType = fertilizerType;
- this.pot_whitelist = pot_whitelist;
- this.beforePlant = beforePlant;
- this.particle = particle;
- this.sound = sound;
- this.icon = icon;
- this.requirements = requirements;
- }
-
- public int getTimes() {
- return times;
- }
-
- public double getChance() {
- return chance;
- }
-
- public boolean canTakeEffect() {
- return Math.random() < chance;
- }
-
- public String getKey() {
- return key;
- }
-
- public FertilizerType getFertilizerType() {
- return fertilizerType;
- }
-
- @Nullable
- public String[] getPotWhitelist() {
- return pot_whitelist;
- }
-
- public boolean isBeforePlant() {
- return beforePlant;
- }
-
- @Nullable
- public Particle getParticle() {
- return particle;
- }
-
- @Nullable
- public Sound getSound() {
- return sound;
- }
-
- public String getIcon() {
- return icon;
- }
-
- public Requirement[] getRequirements() {
- return requirements;
- }
-
- public boolean canUse(Player player, Location location) {
- if (requirements == null) return true;
- CurrentState currentState = new CurrentState(location, player);
- for (Requirement requirement : requirements) {
- if (!requirement.isConditionMet(currentState)) {
- return false;
- }
- }
- return true;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerManager.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerManager.java
deleted file mode 100644
index b3da0cc..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/FertilizerManager.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.kyori.adventure.key.Key;
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.Function;
-import net.momirealms.customcrops.api.object.Pair;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import net.momirealms.customcrops.util.AdventureUtils;
-import net.momirealms.customcrops.util.ConfigUtils;
-import org.bukkit.Particle;
-import org.bukkit.configuration.ConfigurationSection;
-import org.bukkit.configuration.file.YamlConfiguration;
-import org.intellij.lang.annotations.Subst;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Locale;
-
-public class FertilizerManager extends Function {
-
- private final CustomCrops plugin;
- private final HashMap fertilizerConfigMap;
- private final HashMap itemToKey;
-
- public FertilizerManager(CustomCrops plugin) {
- this.plugin = plugin;
- this.fertilizerConfigMap = new HashMap<>();
- this.itemToKey = new HashMap<>();
- }
-
- @Override
- public void load() {
- this.loadConfig();
- }
-
- @Override
- public void unload() {
- this.fertilizerConfigMap.clear();
- this.itemToKey.clear();
- }
-
- @Nullable
- public FertilizerConfig getConfigByFertilizer(@Nullable Fertilizer fertilizer) {
- if (fertilizer == null) return null;
- return fertilizerConfigMap.get(fertilizer.getKey());
- }
-
- @Nullable
- public FertilizerConfig getConfigByKey(String key) {
- return fertilizerConfigMap.get(key);
- }
-
- @Nullable
- public FertilizerConfig getConfigByItemID(String id) {
- String key = itemToKey.get(id);
- if (key == null) return null;
- return getConfigByKey(key);
- }
-
- private void loadConfig() {
- File can_folder = new File(plugin.getDataFolder(), "contents" + File.separator + "fertilizers");
- if (!can_folder.exists()) {
- if (!can_folder.mkdirs()) return;
- ConfigUtils.getConfig("contents" + File.separator + "fertilizers" + File.separator + "speed-grow.yml");
- ConfigUtils.getConfig("contents" + File.separator + "fertilizers" + File.separator + "quality.yml");
- ConfigUtils.getConfig("contents" + File.separator + "fertilizers" + File.separator + "soil-retain.yml");
- ConfigUtils.getConfig("contents" + File.separator + "fertilizers" + File.separator + "yield-increase.yml");
- ConfigUtils.getConfig("contents" + File.separator + "fertilizers" + File.separator + "variation.yml");
- }
- File[] files = can_folder.listFiles();
- if (files == null) return;
- for (File file : files) {
- YamlConfiguration config = YamlConfiguration.loadConfiguration(file);
- for (String key : config.getKeys(false)) {
- ConfigurationSection fertilizerSec = config.getConfigurationSection(key);
- if (fertilizerSec == null) continue;
- FertilizerConfig fertilizerConfig;
- FertilizerType fertilizerType = FertilizerType.valueOf(fertilizerSec.getString("type", "SPEED_GROW").toUpperCase(Locale.ENGLISH));
- String[] pot_whitelist = fertilizerSec.contains("pot-whitelist") ? fertilizerSec.getStringList("pot-whitelist").toArray(new String[0]) : null;
- boolean beforePlant = fertilizerSec.getBoolean("before-plant", false);
- int times = fertilizerSec.getInt("times", 14);
- Particle particle = fertilizerSec.contains("particle") ? Particle.valueOf(fertilizerSec.getString("particle")) : null;
- @Subst("namespace:key") String soundKey = fertilizerSec.getString("sound", "minecraft:item.hoe.till");
- Sound sound = fertilizerSec.contains("sound") ? Sound.sound(Key.key(soundKey), Sound.Source.PLAYER, 1, 1) : null;
- String icon = fertilizerSec.getString("icon");
- Requirement[] requirements = ConfigUtils.getRequirementsWithMsg(fertilizerSec.getConfigurationSection("requirements"));
- switch (fertilizerType) {
- case SPEED_GROW -> fertilizerConfig = new SpeedGrow(key, fertilizerType, times, getChancePair(fertilizerSec), pot_whitelist, beforePlant, particle, sound, icon, requirements);
- case YIELD_INCREASE -> fertilizerConfig = new YieldIncrease(key, fertilizerType, times, fertilizerSec.getDouble("chance"), getChancePair(fertilizerSec), pot_whitelist, beforePlant, particle, sound, icon, requirements);
- case VARIATION -> fertilizerConfig = new Variation(key, fertilizerType, times, fertilizerSec.getDouble("chance"), pot_whitelist, beforePlant, particle, sound, icon, requirements);
- case QUALITY -> fertilizerConfig = new Quality(key, fertilizerType, times, fertilizerSec.getDouble("chance"), ConfigUtils.getQualityRatio(fertilizerSec.getString("ratio", "2/2/1")), pot_whitelist, beforePlant, particle, sound, icon, requirements);
- case SOIL_RETAIN -> fertilizerConfig = new SoilRetain(key, fertilizerType, times, fertilizerSec.getDouble("chance"), pot_whitelist, beforePlant, particle, sound, icon, requirements);
- default -> fertilizerConfig = null;
- }
- String item = fertilizerSec.getString("item");
- if (fertilizerConfig != null && item != null) {
- fertilizerConfigMap.put(key, fertilizerConfig);
- itemToKey.put(item, key);
- }
- else
- AdventureUtils.consoleMessage("[CustomCrops] Invalid fertilizer: " + key);
- }
- }
- AdventureUtils.consoleMessage("[CustomCrops] Loaded " + fertilizerConfigMap.size() + " fertilizer(s)");
- }
-
- public ArrayList> getChancePair(ConfigurationSection fertilizerSec) {
- ArrayList> pairs = new ArrayList<>();
- ConfigurationSection effectSec = fertilizerSec.getConfigurationSection("chance");
- if (effectSec == null) return new ArrayList<>();
- for (String point : effectSec.getKeys(false)) {
- Pair pair = new Pair<>(effectSec.getDouble(point), Integer.parseInt(point));
- pairs.add(pair);
- }
- return pairs;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Quality.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Quality.java
deleted file mode 100644
index 3ab9740..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Quality.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import net.momirealms.customcrops.util.AdventureUtils;
-import org.bukkit.Particle;
-import org.jetbrains.annotations.Nullable;
-
-public class Quality extends FertilizerConfig {
-
- private final double[] ratio;
-
- public Quality(
- String key,
- FertilizerType fertilizerType,
- int times,
- double chance,
- double[] ratio,
- @Nullable String[] pot_whitelist,
- boolean beforePlant,
- @Nullable Particle particle,
- @Nullable Sound sound,
- @Nullable String icon,
- Requirement[] requirements
- ) {
- super(key, fertilizerType, times, chance, pot_whitelist, beforePlant, particle, sound, icon, requirements);
- this.ratio = ratio;
- if (this.ratio.length != ConfigManager.defaultRatio.length) {
- AdventureUtils.consoleMessage("[CustomCrops] Wrong format found at fertilizer: " + key + ". You should make sure that all the quality ratio are in the same format. For example when you set default-ratio to x/x/x/x/x in config.yml. You should set ratio to x/x/x/x/x in fertilizers to work");
- }
- }
-
- public double[] getRatio() {
- return ratio;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/SoilRetain.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/SoilRetain.java
deleted file mode 100644
index 608382e..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/SoilRetain.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import org.bukkit.Particle;
-import org.jetbrains.annotations.Nullable;
-
-public class SoilRetain extends FertilizerConfig {
-
- public SoilRetain(
- String key,
- FertilizerType fertilizerType,
- int times,
- double chance,
- @Nullable String[] pot_whitelist,
- boolean beforePlant,
- @Nullable Particle particle,
- @Nullable Sound sound,
- String icon,
- Requirement[] requirements
- ) {
- super(key, fertilizerType, times, chance, pot_whitelist, beforePlant, particle, sound, icon, requirements);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Variation.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Variation.java
deleted file mode 100644
index cc515db..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/fertilizer/Variation.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.fertilizer;
-
-import net.kyori.adventure.sound.Sound;
-import net.momirealms.customcrops.api.object.requirement.Requirement;
-import org.bukkit.Particle;
-import org.jetbrains.annotations.Nullable;
-
-public class Variation extends FertilizerConfig {
-
- public Variation(
- String key,
- FertilizerType fertilizerType,
- int times,
- double chance,
- @Nullable String[] pot_whitelist,
- boolean beforePlant,
- @Nullable Particle particle,
- @Nullable Sound sound,
- String icon,
- Requirement[] requirements
- ) {
- super(key, fertilizerType, times, chance, pot_whitelist, beforePlant, particle, sound, icon, requirements);
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/AbstractHologram.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/AbstractHologram.java
deleted file mode 100644
index 003681f..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/AbstractHologram.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.hologram;
-
-public abstract class AbstractHologram {
-
- protected final String content;
- private final double offset;
- private final HologramManager.Mode mode;
- private final int duration;
- private TextDisplayMeta textDisplayMeta;
-
- public AbstractHologram(String content, double offset, HologramManager.Mode mode, int duration, TextDisplayMeta textDisplayMeta) {
- this.content = content;
- this.offset = offset;
- this.mode = mode;
- this.duration = duration;
- this.textDisplayMeta = textDisplayMeta;
- }
-
- public String getContent() {
- return content;
- }
-
- public double getOffset() {
- return offset;
- }
-
- public HologramManager.Mode getMode() {
- return mode;
- }
-
- public int getDuration() {
- return duration;
- }
-
- public TextDisplayMeta getTextDisplayMeta() {
- return textDisplayMeta;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/FertilizerHologram.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/FertilizerHologram.java
deleted file mode 100644
index 7a884ea..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/FertilizerHologram.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.hologram;
-
-
-import net.momirealms.customcrops.api.object.CCFertilizer;
-import net.momirealms.customcrops.api.object.fertilizer.Fertilizer;
-import net.momirealms.customcrops.api.object.fertilizer.FertilizerConfig;
-import org.jetbrains.annotations.NotNull;
-
-public class FertilizerHologram extends AbstractHologram {
-
- public FertilizerHologram(@NotNull String content, double offset, HologramManager.Mode mode, int duration, TextDisplayMeta textDisplayMeta) {
- super(content, offset, mode, duration, textDisplayMeta);
- }
-
- public String getContent(CCFertilizer CCFertilizer) {
- Fertilizer fertilizer = (Fertilizer) CCFertilizer;
- FertilizerConfig fertilizerConfig = fertilizer.getConfig();
- return content.replace("{icon}", String.valueOf(fertilizerConfig.getIcon()))
- .replace("{left_times}", String.valueOf(fertilizer.getLeftTimes()))
- .replace("{max_times}", String.valueOf(fertilizerConfig.getTimes()));
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/TextDisplayMeta.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/TextDisplayMeta.java
deleted file mode 100644
index e5796a1..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/TextDisplayMeta.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package net.momirealms.customcrops.api.object.hologram;
-
-public record TextDisplayMeta(boolean hasShadow, boolean isSeeThrough, boolean useDefaultBackground,
- int backgroundColor, byte opacity) {
-
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/WaterAmountHologram.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/WaterAmountHologram.java
deleted file mode 100644
index 67b7d2e..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/hologram/WaterAmountHologram.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.hologram;
-
-import org.jetbrains.annotations.NotNull;
-
-public class WaterAmountHologram extends AbstractHologram {
-
- private final String bar_left;
- private final String bar_full;
- private final String bar_empty;
- private final String bar_right;
-
-
- public WaterAmountHologram(@NotNull String content, double offset, HologramManager.Mode mode, int duration,
- String bar_left, String bar_full, String bar_empty, String bar_right, TextDisplayMeta textDisplayMeta) {
- super(content, offset, mode, duration, textDisplayMeta);
- this.bar_left = bar_left;
- this.bar_full = bar_full;
- this.bar_empty = bar_empty;
- this.bar_right = bar_right;
- }
-
- public String getContent(int current, int storage) {
- return super.content.replace("{current}", String.valueOf(current))
- .replace("{storage}", String.valueOf(storage))
- .replace("{water_bar}", getWaterBar(current, storage));
- }
-
- private String getWaterBar(int current, int storage) {
- return bar_left +
- String.valueOf(bar_full).repeat(current) +
- String.valueOf(bar_empty).repeat(Math.max(storage - current, 0)) +
- bar_right;
- }
-}
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/Loot.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/Loot.java
deleted file mode 100644
index 3d61065..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/Loot.java
+++ /dev/null
@@ -1,67 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.loot;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.integration.SkillInterface;
-import net.objecthunter.exp4j.Expression;
-import net.objecthunter.exp4j.ExpressionBuilder;
-import org.bukkit.Location;
-import org.bukkit.entity.Player;
-import org.jetbrains.annotations.Nullable;
-
-import java.util.concurrent.ThreadLocalRandom;
-
-public abstract class Loot {
-
- public int min;
- public int max;
-
- public Loot(int min, int max) {
- this.min = min;
- this.max = max;
- }
-
- public abstract void drop(@Nullable Player player, Location location, boolean toInv);
-
- public int getMin() {
- return min;
- }
-
- public int getMax() {
- return max;
- }
-
- public int getAmount(@Nullable Player player) {
- int random = ThreadLocalRandom.current().nextInt(getMin(), getMax() + 1);
- if (ConfigManager.enableSkillBonus && player != null) {
- SkillInterface skillInterface = CustomCrops.getInstance().getIntegrationManager().getSkillInterface();
- if (skillInterface != null) {
- int level = skillInterface.getLevel(player);
- Expression expression = new ExpressionBuilder(ConfigManager.bonusFormula)
- .variables("base", "level")
- .build()
- .setVariable("base", random)
- .setVariable("level", level);
- random = (int) expression.evaluate();
- }
- }
- return random;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/OtherLoot.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/OtherLoot.java
deleted file mode 100644
index 84520a1..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/OtherLoot.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.loot;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.fertilizer.YieldIncrease;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.ItemUtils;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-public class OtherLoot extends Loot {
-
- private final String itemID;
- private final double chance;
-
- public OtherLoot(int min, int max, String itemID, double chance) {
- super(min, max);
- this.itemID = itemID;
- this.chance = chance;
- }
-
- public String getItemID() {
- return itemID;
- }
-
- public double getChance() {
- return chance;
- }
-
- @Override
- public void drop(Player player, Location location, boolean toInv) {
- if (Math.random() < getChance()) {
- int random = getAmount(player);
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(SimpleLocation.getByBukkitLocation(location).add(0,-1,0));
- if (pot != null && pot.getFertilizer() != null && pot.getFertilizer().getConfig() instanceof YieldIncrease increase) {
- random += increase.getAmountBonus();
- }
- ItemStack drop = CustomCrops.getInstance().getIntegrationManager().build(getItemID(), player);
- if (drop.getType() == Material.AIR) return;
- drop.setAmount(random);
-
- if (toInv) {
- int remain = ItemUtils.putLootsToBag(player.getInventory(), drop, drop.getAmount());
- if (remain > 0) {
- drop.setAmount(remain);
- location.getWorld().dropItemNaturally(location, drop);
- }
- } else {
- location.getWorld().dropItemNaturally(location, drop);
- }
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/QualityLoot.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/QualityLoot.java
deleted file mode 100644
index e7638ac..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/loot/QualityLoot.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.loot;
-
-import net.momirealms.customcrops.CustomCrops;
-import net.momirealms.customcrops.api.object.basic.ConfigManager;
-import net.momirealms.customcrops.api.object.fertilizer.FertilizerConfig;
-import net.momirealms.customcrops.api.object.fertilizer.Quality;
-import net.momirealms.customcrops.api.object.fertilizer.YieldIncrease;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.ItemUtils;
-import org.bukkit.Location;
-import org.bukkit.Material;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-
-public class QualityLoot extends Loot {
-
- private final String[] qualityLoots;
-
- public QualityLoot(int min, int max, String... qualityLoots) {
- super(min, max);
- this.qualityLoots = qualityLoots;
- }
-
- @Override
- public void drop(Player player, Location location, boolean toInv) {
- SimpleLocation simpleLocation = SimpleLocation.getByBukkitLocation(location);
- Pot pot = CustomCrops.getInstance().getWorldDataManager().getPotData(simpleLocation.add(0,-1,0));
- int amount = getAmount(player);
- double[] qualityRatio = ConfigManager.defaultRatio;
- if (pot != null) {
- FertilizerConfig fertilizerConfig = CustomCrops.getInstance().getFertilizerManager().getConfigByFertilizer(pot.getFertilizer());
- if (fertilizerConfig instanceof Quality quality && quality.canTakeEffect()) {
- qualityRatio = quality.getRatio();
- } else if (fertilizerConfig instanceof YieldIncrease increase) {
- amount += increase.getAmountBonus();
- }
- }
- for (int i = 0; i < amount; i++) {
- double random = Math.random();
- for (int j = 0; j < qualityRatio.length; j++) {
- if (random < qualityRatio[j]) {
- dropItem(location, qualityLoots[j], player, toInv);
- break;
- }
- }
- }
- }
-
- private void dropItem(Location location, String id, Player player, boolean toInv) {
- ItemStack drop = CustomCrops.getInstance().getIntegrationManager().build(id, player);
- if (drop.getType() == Material.AIR) return;
- if (toInv) {
- int remain = ItemUtils.putLootsToBag(player.getInventory(), drop, drop.getAmount());
- if (remain > 0) {
- drop.setAmount(remain);
- location.getWorld().dropItemNaturally(location, drop);
- }
- } else {
- location.getWorld().dropItemNaturally(location, drop);
- }
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/migrate/MigrateWorld.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/migrate/MigrateWorld.java
deleted file mode 100644
index ea1e35b..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/migrate/MigrateWorld.java
+++ /dev/null
@@ -1,238 +0,0 @@
-/*
- * Copyright (C) <2022>
- *
- * 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
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program. If not, see .
- */
-
-package net.momirealms.customcrops.api.object.migrate;
-
-import net.momirealms.customcrops.api.object.Function;
-import net.momirealms.customcrops.api.object.crop.GrowingCrop;
-import net.momirealms.customcrops.api.object.fertilizer.Fertilizer;
-import net.momirealms.customcrops.api.object.pot.Pot;
-import net.momirealms.customcrops.api.object.sprinkler.Sprinkler;
-import net.momirealms.customcrops.api.object.world.CCChunk;
-import net.momirealms.customcrops.api.object.world.ChunkCoordinate;
-import net.momirealms.customcrops.api.object.world.SimpleLocation;
-import net.momirealms.customcrops.util.ConfigUtils;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-
-import java.io.*;
-import java.util.Map;
-import java.util.concurrent.ConcurrentHashMap;
-
-public class MigrateWorld extends Function {
-
- private final String worldName;
- private final ConcurrentHashMap chunkMap;
-
- public MigrateWorld(String world) {
- this.worldName = world;
- this.chunkMap = new ConcurrentHashMap<>(64);
- }
-
- @Override
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public void init() {
- File chunks_folder = ConfigUtils.getFile(worldName, "chunks");
- if (!chunks_folder.exists()) chunks_folder.mkdirs();
- File[] data_files = chunks_folder.listFiles();
- if (data_files == null) return;
- for (File file : data_files) {
- ChunkCoordinate chunkCoordinate = ChunkCoordinate.getByString(file.getName().substring(0, file.getName().length() - 7));
- try (FileInputStream fis = new FileInputStream(file); ObjectInputStream ois = new ObjectInputStream(fis)) {
- CCChunk chunk = (CCChunk) ois.readObject();
- if (chunk.isUseless()) {
- file.delete();
- continue;
- }
- if (chunkCoordinate != null) chunkMap.put(chunkCoordinate, chunk);
- } catch (IOException | ClassNotFoundException e) {
- e.printStackTrace();
- }
- }
- }
-
- @Override
- @SuppressWarnings("ResultOfMethodCallIgnored")
- public void disable() {
- File chunks_folder = ConfigUtils.getFile(worldName, "chunks");
- if (!chunks_folder.exists()) chunks_folder.mkdirs();
- for (Map.Entry entry : chunkMap.entrySet()) {
- ChunkCoordinate chunkCoordinate = entry.getKey();
- CCChunk chunk = entry.getValue();
- String fileName = chunkCoordinate.getFileName() + ".ccdata";
- File file = new File(chunks_folder, fileName);
- if (chunk.isUseless() && file.exists()) {
- file.delete();
- continue;
- }
- try (FileOutputStream fos = new FileOutputStream(file); ObjectOutputStream oos = new ObjectOutputStream(fos)) {
- oos.writeObject(chunk);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- }
-
- public String getWorldName() {
- return worldName;
- }
-
- public void removePotData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return;
- chunk.removePotData(simpleLocation);
- }
-
- public void removeCropData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return;
- chunk.removeCropData(simpleLocation);
- }
-
- public void addCropData(SimpleLocation simpleLocation, GrowingCrop growingCrop) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addCropData(simpleLocation, growingCrop);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addCropData(simpleLocation, growingCrop);
- }
-
- public GrowingCrop getCropData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- return chunk.getCropData(simpleLocation);
- }
- return null;
- }
-
- public int getChunkCropAmount(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return 0;
- return chunk.getCropAmount();
- }
-
- public void removeGreenhouse(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return;
- chunk.removeGreenhouse(simpleLocation);
- }
-
- public void addGreenhouse(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addGreenhouse(simpleLocation);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addGreenhouse(simpleLocation);
- }
-
- public boolean isGreenhouse(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return false;
- return chunk.isGreenhouse(simpleLocation);
- }
-
- public void removeScarecrow(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return;
- chunk.removeScarecrow(simpleLocation);
- }
-
- public void addScarecrow(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addScarecrow(simpleLocation);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addScarecrow(simpleLocation);
- }
-
- public boolean hasScarecrow(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return false;
- return chunk.hasScarecrow();
- }
-
- public void removeSprinklerData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return;
- chunk.removeSprinklerData(simpleLocation);
- }
-
- public void addSprinklerData(SimpleLocation simpleLocation, Sprinkler sprinkler) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addSprinklerData(simpleLocation, sprinkler);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addSprinklerData(simpleLocation, sprinkler);
- }
-
- @Nullable
- public Sprinkler getSprinklerData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return null;
- return chunk.getSprinklerData(simpleLocation);
- }
-
- public void addWaterToPot(SimpleLocation simpleLocation, int amount, @NotNull String pot_id) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addWaterToPot(simpleLocation, amount, pot_id);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addWaterToPot(simpleLocation, amount, pot_id);
- }
-
- public void addFertilizerToPot(SimpleLocation simpleLocation, Fertilizer fertilizer, @NotNull String pot_id) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addFertilizerToPot(simpleLocation, fertilizer, pot_id);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addFertilizerToPot(simpleLocation, fertilizer, pot_id);
- }
-
- public Pot getPotData(SimpleLocation simpleLocation) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk == null) return null;
- return chunk.getPotData(simpleLocation);
- }
-
- public void addPotData(SimpleLocation simpleLocation, Pot pot) {
- CCChunk chunk = chunkMap.get(simpleLocation.getChunkCoordinate());
- if (chunk != null) {
- chunk.addPotData(simpleLocation, pot);
- return;
- }
- chunk = createNewChunk(simpleLocation);
- chunk.addPotData(simpleLocation, pot);
- }
-
- public CCChunk createNewChunk(SimpleLocation simpleLocation) {
- CCChunk newChunk = new CCChunk();
- chunkMap.put(simpleLocation.getChunkCoordinate(), newChunk);
- return newChunk;
- }
-}
\ No newline at end of file
diff --git a/plugin/src/main/java/net/momirealms/customcrops/api/object/pot/Pot.java b/plugin/src/main/java/net/momirealms/customcrops/api/object/pot/Pot.java
deleted file mode 100644
index 7753e87..0000000
--- a/plugin/src/main/java/net/momirealms/customcrops/api/object/pot/Pot.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*
- * Copyright (C) <2022>