9
0
mirror of https://github.com/Xiao-MoMi/Custom-Crops.git synced 2025-12-19 15:09:25 +00:00
This commit is contained in:
XiaoMoMi
2024-03-09 07:19:25 +08:00
parent db04715107
commit a3f2b62394
366 changed files with 20684 additions and 15814 deletions

674
LICENSE Normal file
View File

@@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
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.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
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 <https://www.gnu.org/licenses/>.
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:
<program> Copyright (C) <year> <name of author>
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
<https://www.gnu.org/licenses/>.
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
<https://www.gnu.org/licenses/why-not-lgpl.html>.

View File

@@ -1,9 +1,14 @@
![2022-08-15_02 51 28](https://user-images.githubusercontent.com/70987828/184551011-7da1dca5-faab-473c-b6a5-d2489b135ca9.png)
# This project is currently under recoding
# Custom-Crops # Custom-Crops
StardewValley Like Farming System ![CodeFactor Grade](https://img.shields.io/codefactor/grade/github/Xiao-MoMi/Custom-Crops)
![bStats Servers](https://img.shields.io/bstats/servers/16593)
![bStats Players](https://img.shields.io/bstats/players/16593)
![GitHub](https://img.shields.io/github/license/Xiao-MoMi/Custom-Crops)
[![](https://jitpack.io/v/Xiao-MoMi/Custom-Crops.svg)](https://jitpack.io/#Xiao-MoMi/Custom-Crops)
<a href="https://mo-mi.gitbook.io/xiaomomi-plugins/plugin-wiki/customcrops" alt="GitBook">
<img src="https://img.shields.io/badge/docs-gitbook-brightgreen" alt="Gitbook"/>
</a>
Ultra-customizable planting experience for Minecraft servers
### Support the developer ### Support the developer
@@ -69,41 +74,3 @@ dependencies {
compileOnly("com.github.Xiao-MoMi:Custom-Crops:{LATEST}") 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
```

View File

@@ -1,3 +1,4 @@
dependencies { 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")
} }

View File

@@ -1,133 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}
}

View File

@@ -17,19 +17,107 @@
package net.momirealms.customcrops.api; package net.momirealms.customcrops.api;
import net.momirealms.customcrops.api.manager.*;
import net.momirealms.customcrops.api.scheduler.Scheduler;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
public abstract class CustomCropsPlugin extends JavaPlugin { public abstract class CustomCropsPlugin extends JavaPlugin {
protected static CustomCropsPlugin instance; 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 CustomCropsPlugin() {
instance = this;
public CustomCropsAPI getAPI() {
return customCropsAPI;
} }
public static CustomCropsPlugin getInstance() { public static CustomCropsPlugin getInstance() {
return instance; 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();
} }

View File

@@ -15,13 +15,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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); void disable();
int getLevel(Player player);
} }

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.common;
public record Pair<L, R>(L left, R right) { public record Pair<L, R>(L left, R right) {

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.common;
public interface Property<T> {
T get();
void set(T value);
}

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}
}

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.common;
public class Tuple<L, M, R> { public class Tuple<L, M, R> {

View File

@@ -0,0 +1,27 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -15,9 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.customplugin; package net.momirealms.customcrops.api.common.item;
public enum Platform { public interface KeyItem {
ItemsAdder,
Oraxen String getKey();
} }

View File

@@ -17,36 +17,33 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Entity; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
* An event that triggered when breaking a crop * 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 static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final String cropItemID;
private final String cropKey;
private final Location location; private final Location location;
private final Entity entity; private final WorldCrop worldCrop;
public CropBreakEvent( public CropBreakEvent(
@Nullable Entity entity, @NotNull Player player,
@NotNull String cropKey, @NotNull Location location,
@NotNull String cropItemID, @Nullable WorldCrop worldCrop
@NotNull Location location
) { ) {
this.entity = entity; super(player);
this.cropItemID = cropItemID;
this.location = location; this.location = location;
this.cropKey = cropKey; this.worldCrop = worldCrop;
} }
@Override @Override
@@ -71,12 +68,12 @@ public class CropBreakEvent extends Event implements Cancellable {
} }
/** /**
* Get the crop item id in IA/Oraxen * Get the crop's data, it might be null if it's spawned by other plugins in the wild
* @return item id * @return crop data
*/ */
@NotNull @Nullable
public String getCropItemID() { public WorldCrop getWorldCrop() {
return cropItemID; return worldCrop;
} }
/** /**
@@ -87,22 +84,4 @@ public class CropBreakEvent extends Event implements Cancellable {
public Location getLocation() { public Location getLocation() {
return location; 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;
}
} }

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldCrop;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -24,6 +25,7 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
/** /**
* An event that triggered when a player interacts a crop * 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 static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final Location location; private final Location location;
private final String cropItemID; private final WorldCrop crop;
private final String cropKey;
private final ItemStack itemInHand; private final ItemStack itemInHand;
public CropInteractEvent( public CropInteractEvent(
@NotNull Player who, @NotNull Player who,
@NotNull ItemStack itemInHand, @NotNull ItemStack itemInHand,
@NotNull Location location, @NotNull Location location,
@NotNull String cropItemID, @Nullable WorldCrop crop
@NotNull String cropKey
) { ) {
super(who); super(who);
this.cropItemID = cropItemID;
this.location = location; this.location = location;
this.cropKey = cropKey; this.crop = crop;
this.itemInHand = itemInHand; this.itemInHand = itemInHand;
} }
@@ -92,20 +91,11 @@ public class CropInteractEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the crop model item id * Get the crop's data, it might be null if it's spawned by other plugins in the wild
* @return model item id * @return crop data
*/ */
@NotNull @Nullable
public String getCropItemID() { public WorldCrop getCrop() {
return cropItemID; return crop;
}
/**
* Get the crop config key
* @return crop key
*/
@NotNull
public String getCropKey() {
return cropKey;
} }
} }

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Crop;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -33,25 +34,22 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final ItemStack itemInHand; private final ItemStack itemInHand;
private final String cropKey; private final Crop crop;
private final Location location; private final Location location;
private int point; private int point;
private String cropItemID;
public CropPlantEvent( public CropPlantEvent(
@NotNull Player who, @NotNull Player who,
@NotNull ItemStack itemInHand, @NotNull ItemStack itemInHand,
@NotNull Location location, @NotNull Location location,
@NotNull String cropKey, @NotNull Crop crop,
int point, int point
@NotNull String cropItemID
) { ) {
super(who); super(who);
this.itemInHand = itemInHand; this.itemInHand = itemInHand;
this.location = location; this.location = location;
this.cropKey = cropKey; this.crop = crop;
this.point = point; this.point = point;
this.cropItemID = cropItemID;
} }
@Override @Override
@@ -85,16 +83,18 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the crop config key * Get the crop's config
* @return crop key *
* @return crop
*/ */
@NotNull @NotNull
public String getCropKey() { public Crop getCrop() {
return cropKey; return crop;
} }
/** /**
* Get the crop location * Get the crop's location
*
* @return location * @return location
*/ */
@NotNull @NotNull
@@ -105,7 +105,7 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
/** /**
* Get the initial point * Get the initial point
* It would be 0 when planting * It would be 0 when planting
* but might be a value higher than 0 when replanting *
* @return point * @return point
*/ */
public int getPoint() { public int getPoint() {
@@ -119,21 +119,4 @@ public class CropPlantEvent extends PlayerEvent implements Cancellable {
public void setPoint(int point) { public void setPoint(int point) {
this.point = 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;
}
} }

View File

@@ -15,36 +15,33 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.scheduler; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.CustomCropsPlugin;
import org.bukkit.Bukkit; import org.bukkit.event.Event;
import org.bukkit.Location; import org.bukkit.event.HandlerList;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.concurrent.Callable; public class CustomCropsReloadEvent extends Event {
import java.util.concurrent.Future;
public class BukkitSchedulerImpl implements SchedulerPlatform { private static final HandlerList handlerList = new HandlerList();
private final CustomCropsPlugin plugin;
private final CustomCrops plugin; public CustomCropsReloadEvent(CustomCropsPlugin plugin) {
public BukkitSchedulerImpl(CustomCrops plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
@Override public static HandlerList getHandlerList() {
public <T> Future<T> callSyncMethod(@NotNull Callable<T> task) { return handlerList;
return Bukkit.getScheduler().callSyncMethod(plugin, task);
} }
@NotNull
@Override @Override
public void runTask(Runnable runnable) { public HandlerList getHandlers() {
Bukkit.getScheduler().runTask(plugin, runnable); return getHandlerList();
} }
@Override public CustomCropsPlugin getPluginInstance() {
public void runTask(Runnable runnable, Location location) { return plugin;
runTask(runnable);
} }
} }

View File

@@ -1,98 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -33,17 +34,17 @@ public class PotBreakEvent extends Event implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final Location location; private final Location location;
private final String potKey; private final WorldPot pot;
private final Entity entity; private final Entity entity;
public PotBreakEvent( public PotBreakEvent(
@Nullable Entity entity, @Nullable Entity entity,
@NotNull Location location, @NotNull Location location,
@NotNull String potKey @NotNull WorldPot pot
) { ) {
this.entity = entity; this.entity = entity;
this.location = location; this.location = location;
this.potKey = potKey; this.pot = pot;
} }
@Override @Override
@@ -76,13 +77,14 @@ public class PotBreakEvent extends Event implements Cancellable {
return location; return location;
} }
/** /**
* Get the pot config key * Get the pot's data
* @return pot key * @return pot
*/ */
@NotNull @NotNull
public String getPotKey() { public WorldPot getPot() {
return potKey; return pot;
} }
/** /**

View File

@@ -1,116 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldPot;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -34,18 +35,18 @@ public class PotInteractEvent extends PlayerEvent implements Cancellable {
private boolean cancelled; private boolean cancelled;
private final ItemStack itemInHand; private final ItemStack itemInHand;
private final Location location; private final Location location;
private final String potKey; private final WorldPot pot;
public PotInteractEvent( public PotInteractEvent(
@NotNull Player who, @NotNull Player who,
@NotNull ItemStack itemInHand, @NotNull ItemStack itemInHand,
@NotNull Location location, @NotNull Location location,
@NotNull String potKey @NotNull WorldPot pot
) { ) {
super(who); super(who);
this.itemInHand = itemInHand; this.itemInHand = itemInHand;
this.location = location; this.location = location;
this.potKey = potKey; this.pot = pot;
} }
@Override @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 * @return pot key
*/ */
@NotNull @NotNull
public String getPotKey() { public WorldPot getPot() {
return potKey; return pot;
} }
} }

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Pot;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final Location location; private final Location location;
private final String potKey; private final Pot pot;
public PotPlaceEvent( public PotPlaceEvent(
@NotNull Player who, @NotNull Player who,
@NotNull Location location, @NotNull Location location,
@NotNull String potKey @NotNull Pot pot
) { ) {
super(who); super(who);
this.location = location; this.location = location;
this.potKey = potKey; this.pot = pot;
} }
@Override @Override
@@ -75,11 +76,11 @@ public class PotPlaceEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the placed pot config key * Get the placed pot's config
* @return pot key * @return pot
*/ */
@NotNull @NotNull
public String getPotKey() { public Pot getPot() {
return potKey; return pot;
} }
} }

View File

@@ -1,104 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -17,25 +17,27 @@
package net.momirealms.customcrops.api.event; 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.World;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.world.WorldEvent;
import org.jetbrains.annotations.NotNull; 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 static final HandlerList handlers = new HandlerList();
private final CCWorldSeason season; private final Season season;
private final World world;
public SeasonChangeEvent( public SeasonChangeEvent(
@NotNull World world, @NotNull World world,
@NotNull CCWorldSeason season @NotNull Season season
) { ) {
super(world); super(true);
this.world = world;
this.season = season; this.season = season;
} }
@@ -55,7 +57,15 @@ public class SeasonChangeEvent extends WorldEvent {
* @return season * @return season
*/ */
@NotNull @NotNull
public CCWorldSeason getSeason() { public Season getSeason() {
return season; return season;
} }
/**
* Get the world
* @return world
*/
public World getWorld() {
return world;
}
} }

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -32,16 +33,16 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final Location location; private final Location location;
private final String sprinklerKey; private final WorldSprinkler sprinkler;
public SprinklerBreakEvent( public SprinklerBreakEvent(
@NotNull Player who, @NotNull Player who,
@NotNull Location location, @NotNull Location location,
@NotNull String sprinklerKey @NotNull WorldSprinkler sprinkler
) { ) {
super(who); super(who);
this.location = location; this.location = location;
this.sprinklerKey = sprinklerKey; this.sprinkler = sprinkler;
} }
@Override @Override
@@ -75,11 +76,11 @@ public class SprinklerBreakEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the sprinkler config key * Get the sprinkler's data
* @return sprinkler key * @return sprinkler
*/ */
@NotNull @NotNull
public String getSprinklerKey() { public WorldSprinkler getSprinkler() {
return sprinklerKey; return sprinkler;
} }
} }

View File

@@ -1,116 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.world.level.WorldSprinkler;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -33,18 +34,18 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
private static final HandlerList handlers = new HandlerList(); private static final HandlerList handlers = new HandlerList();
private boolean cancelled; private boolean cancelled;
private final Location location; private final Location location;
private final String sprinklerKey; private final WorldSprinkler sprinkler;
private final ItemStack itemInHand; private final ItemStack itemInHand;
public SprinklerInteractEvent( public SprinklerInteractEvent(
@NotNull Player who, @NotNull Player who,
@NotNull ItemStack itemInHand, @NotNull ItemStack itemInHand,
@NotNull Location location, @NotNull Location location,
@NotNull String sprinklerKey @NotNull WorldSprinkler sprinkler
) { ) {
super(who); super(who);
this.location = location; this.location = location;
this.sprinklerKey = sprinklerKey; this.sprinkler = sprinkler;
this.itemInHand = itemInHand; this.itemInHand = itemInHand;
} }
@@ -79,12 +80,12 @@ public class SprinklerInteractEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the sprinkler config key * Get the sprinkler's data
* @return sprinkler key * @return sprinkler
*/ */
@NotNull @NotNull
public String getSprinklerKey() { public WorldSprinkler getSprinkler() {
return sprinklerKey; return sprinkler;
} }
/** /**

View File

@@ -17,6 +17,7 @@
package net.momirealms.customcrops.api.event; package net.momirealms.customcrops.api.event;
import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable; import org.bukkit.event.Cancellable;
@@ -34,13 +35,13 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
private boolean cancelled; private boolean cancelled;
private final ItemStack itemInHand; private final ItemStack itemInHand;
private final Location location; 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); super(who);
this.itemInHand = itemInHand; this.itemInHand = itemInHand;
this.location = location; this.location = location;
this.sprinklerKey = sprinklerKey; this.sprinkler = sprinkler;
} }
@Override @Override
@@ -83,11 +84,11 @@ public class SprinklerPlaceEvent extends PlayerEvent implements Cancellable {
} }
/** /**
* Get the sprinkler config key * Get the sprinkler's config
* @return sprinkler key * @return sprinkler
*/ */
@NotNull @NotNull
public String getSprinklerKey() { public Sprinkler getSprinkler() {
return sprinklerKey; return sprinkler;
} }
} }

View File

@@ -15,14 +15,16 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.integration; package net.momirealms.customcrops.api.integration;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable;
public interface ItemInterface { public interface ItemLibrary {
@Nullable String identification();
ItemStack build(String id, Player player);
ItemStack buildItem(Player player, String id);
String getItemID(ItemStack itemStack);
} }

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -0,0 +1,41 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<ActionTrigger, Action[]> 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);
}
}

View File

@@ -0,0 +1,61 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -0,0 +1,160 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<UUID, Data> 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<String, Long> 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;
}
}
}
}

View File

@@ -0,0 +1,62 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -0,0 +1,113 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Location> getPotInRange(Location baseLocation, int width, int length, float yaw, String potID);
}

View File

@@ -0,0 +1,54 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,47 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String, String> vars);
public abstract List<String> parse(Player player, List<String> text, Map<String, String> vars);
public abstract List<String> detectPlaceholders(String text);
public abstract String setPlaceholders(Player player, String text);
}

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -0,0 +1,77 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Boolean> checkUpdate();
}

View File

@@ -0,0 +1,142 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String> getWorldNames();
/**
* Get all the worlds loaded in CustomCrops
*
* @return worlds
*/
@NotNull
Collection<World> getBukkitWorlds();
/**
* Get all the worlds loaded in CustomCrops
*
* @return worlds
*/
@NotNull
Collection<? extends CustomCropsWorld> getCustomCropsWorlds();
@NotNull
Optional<CustomCropsWorld> getCustomCropsWorld(@NotNull String name);
@NotNull
Optional<CustomCropsWorld> getCustomCropsWorld(@NotNull World world);
@NotNull
Optional<WorldSprinkler> getSprinklerAt(@NotNull SimpleLocation location);
@NotNull
Optional<WorldPot> getPotAt(@NotNull SimpleLocation location);
@NotNull
Optional<WorldCrop> getCropAt(@NotNull SimpleLocation location);
@NotNull Optional<WorldGlass> getGlassAt(@NotNull SimpleLocation location);
@NotNull Optional<WorldScarecrow> getScarecrowAt(@NotNull SimpleLocation location);
Optional<CustomCropsBlock> 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);
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
import net.momirealms.customcrops.api.mechanic.requirement.State;
public interface Action {
void trigger(State condition);
}

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.action;
public interface ActionFactory {
Action build(Object args, double chance);
}

View File

@@ -0,0 +1,36 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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,
}

View File

@@ -15,11 +15,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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 { public interface Condition {
boolean isMet(SimpleLocation simpleLocation); boolean isConditionMet(CustomCropsBlock block);
} }

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.condition;
public interface ConditionFactory {
Condition build(Object args);
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Pair<Double, Integer>> pointGainList;
private final Action[] actions;
public BoneMeal(String item, int usedAmount, String returned, int returnedAmount, List<Pair<Double, Integer>> 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<Double, Integer> 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;
}
}

View File

@@ -0,0 +1,79 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String> getPotWhitelist();
ItemCarrier getItemCarrier();
interface Stage {
double getHologramOffset();
@Nullable String getStageID();
int getPoint();
void trigger(ActionTrigger trigger, State state);
Requirement[] getInteractRequirements();
Requirement[] getBreakRequirements();
}
}

View File

@@ -15,28 +15,27 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.mechanic.item;
/** import net.momirealms.customcrops.api.common.item.EventItem;
* Crops import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
*/
public interface CCGrowingCrop {
/** import java.util.HashSet;
* Get the crop growing point
* @return point
*/
int getPoints();
/** public interface Fertilizer extends EventItem {
* Set the growing point
* @param points points
*/
void setPoints(int points);
/**
* Get the crop config key
* @return crop key
*/
String getKey(); String getKey();
String getItemID();
int getTimes();
FertilizerType getFertilizerType();
HashSet<String> getPotWhitelist();
boolean isBeforePlant();
String getIcon();
Requirement[] getRequirements();
} }

View File

@@ -15,7 +15,7 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.fertilizer; package net.momirealms.customcrops.api.mechanic.item;
public enum FertilizerType { public enum FertilizerType {
SPEED_GROW, SPEED_GROW,

View File

@@ -15,16 +15,13 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.mechanic.item;
import java.io.Serializable; public enum ItemCarrier {
NOTE_BLOCK,
public enum ItemMode implements Serializable { MUSHROOM,
CHORUS,
ARMOR_STAND,
TRIPWIRE, TRIPWIRE,
ITEM_FRAME, ITEM_FRAME,
ITEM_DISPLAY, ITEM_DISPLAY
NOTE_BLOCK,
CHORUS
} }

View File

@@ -15,15 +15,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.mechanic.item;
public enum ItemType { public enum ItemType {
GLASS,
POT,
CROP, CROP,
POT,
SPRINKLER, SPRINKLER,
SCARECROW, GREENHOUSE,
WATERING_CAN, SCARECROW
UNKNOWN
} }

View File

@@ -0,0 +1,57 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String> 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);
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item;
import net.momirealms.customcrops.api.common.item.KeyItem;
public interface Scarecrow extends KeyItem {
String getItemID();
}

View File

@@ -0,0 +1,60 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String> getPotWhitelist();
ItemCarrier getItemCarrier();
PassiveFillMethod[] getPassiveFillMethods();
Requirement[] getPlaceRequirements();
Requirement[] getBreakRequirements();
Requirement[] getUseRequirements();
void trigger(ActionTrigger trigger, State state);
WaterBar getWaterBar();
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String, String> args);
int getCurrentWater(ItemStack itemStack);
HashSet<String> getPotWhitelist();
HashSet<String> getSprinklerWhitelist();
List<String> getLore();
@Nullable WaterBar getWaterBar();
Requirement[] getRequirements();
boolean isInfinite();
void trigger(ActionTrigger trigger, State state);
}

View File

@@ -15,13 +15,12 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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); double[] getRatio();
int getDate(String world);
} }

View File

@@ -15,23 +15,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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 {
} double getChance();
public void load() {
}
public void unload() {
}
public void disable() {
}
} }

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface SpeedGrow extends Fertilizer {
int getPointBonus();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface Variation extends Fertilizer {
double getChanceBonus();
}

View File

@@ -0,0 +1,25 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.item.fertilizer;
import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
public interface YieldIncrease extends Fertilizer {
int getAmountBonus();
}

View File

@@ -15,35 +15,35 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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.api.manager.ActionManager;
import org.bukkit.Particle; import net.momirealms.customcrops.api.manager.RequirementManager;
import org.jetbrains.annotations.Nullable; 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 { public abstract class AbstractFillMethod {
protected int amount; protected int amount;
protected Particle particle; private final Action[] actions;
protected Sound sound; private final Requirement[] requirements;
protected AbstractFillMethod(int amount, Particle particle, Sound sound) { protected AbstractFillMethod(int amount, Action[] actions, Requirement[] requirements) {
this.amount = amount; this.amount = amount;
this.particle = particle; this.actions = actions;
this.sound = sound; this.requirements = requirements;
} }
public int getAmount() { public int getAmount() {
return amount; return amount;
} }
@Nullable public void trigger(State state) {
public Particle getParticle() { ActionManager.triggerActions(state, actions);
return particle;
} }
public boolean canFill(State state) {
public Sound getSound() { return RequirementManager.isRequirementMet(state, requirements);
return sound;
} }
} }

View File

@@ -15,32 +15,40 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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.api.mechanic.action.Action;
import net.momirealms.customcrops.CustomCrops; import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
import org.bukkit.Particle;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
public class PassiveFillMethod extends AbstractFillMethod { public class PassiveFillMethod extends AbstractFillMethod {
private final String used; private final String used;
private final int usedAmount;
private final String returned; private final String returned;
private final int returnedAmount;
public PassiveFillMethod(String used, @Nullable String returned, int amount, @Nullable Particle particle, @Nullable Sound sound) { public PassiveFillMethod(String used, int usedAmount, @Nullable String returned, int returnedAmount, int amount, Action[] actions, Requirement[] requirements) {
super(amount, particle, sound); super(amount, actions, requirements);
this.used = used; this.used = used;
this.returned = returned; this.returned = returned;
this.usedAmount = usedAmount;
this.returnedAmount = returnedAmount;
} }
public boolean isRightItem(String item_id) { public String getUsed() {
return used.equals(item_id); return used;
} }
@Nullable public String getReturned() {
public ItemStack getReturnedItemStack() { return returned;
if (returned == null) return null; }
return CustomCrops.getInstance().getIntegrationManager().build(returned);
public int getUsedAmount() {
return usedAmount;
}
public int getReturnedAmount() {
return returnedAmount;
} }
} }

View File

@@ -15,17 +15,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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.api.mechanic.action.Action;
import org.bukkit.Particle; import net.momirealms.customcrops.api.mechanic.requirement.Requirement;
public class PositiveFillMethod extends AbstractFillMethod { public class PositiveFillMethod extends AbstractFillMethod {
private final String id; private final String id;
public PositiveFillMethod(String id, int amount, Particle particle, Sound sound) { public PositiveFillMethod(String id, int amount, Action[] actions, Requirement[] requirements) {
super(amount, particle, sound); super(amount, actions, requirements);
this.id = id; this.id = id;
} }

View File

@@ -15,10 +15,11 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.requirement.papi; package net.momirealms.customcrops.api.mechanic.misc;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
public interface PapiRequirement { public interface Value {
boolean isMet(Player player);
double get(Player player);
} }

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -15,9 +15,9 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.requirement; package net.momirealms.customcrops.api.mechanic.requirement;
public interface Requirement { public interface Requirement {
boolean isConditionMet(CurrentState currentState); boolean isStateMet(State state);
} }

View File

@@ -0,0 +1,29 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<Action> notMetActions, boolean advanced);
default Requirement build(Object args) {
return build(args, null, false);
}
}

View File

@@ -0,0 +1,71 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<String, String> 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<String, String> getArgs() {
return args;
}
public void setArg(String key, String value) {
args.put(key, value);
}
public String getArg(String key) {
return args.get(key);
}
}

View File

@@ -15,34 +15,17 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.world; package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.jetbrains.annotations.NotNull; 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; public static ChunkCoordinate of(int x, int z) {
private final int z; return new ChunkCoordinate(x, 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;
} }
@Override @Override
@@ -69,21 +52,16 @@ public class ChunkCoordinate implements Serializable {
return true; 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 @NotNull
public static ChunkCoordinate getByBukkitChunk(@NotNull Chunk chunk) { public static ChunkCoordinate getByBukkitChunk(@NotNull Chunk chunk) {
return new ChunkCoordinate(chunk.getX(), chunk.getZ()); return new ChunkCoordinate(chunk.getX(), chunk.getZ());
} }
@Override
public String toString() {
return "ChunkCoordinate{" +
"x=" + x +
", z=" + z +
'}';
}
} }

View File

@@ -0,0 +1,87 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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() +
'}';
}
}

View File

@@ -0,0 +1,26 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -15,26 +15,24 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object.world; package net.momirealms.customcrops.api.mechanic.world;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.World; import org.bukkit.World;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.io.Serial;
import java.io.Serializable;
import java.util.Objects; import java.util.Objects;
public class SimpleLocation implements Serializable { public class SimpleLocation {
@Serial private int x;
private static final long serialVersionUID = -1288860694388882412L; private int y;
private int z;
private String worldName;
private final int x; private SimpleLocation() {
private final int y; }
private final int z;
private final String worldName;
public SimpleLocation(String worldName, int x, int y, int z){ public SimpleLocation(String worldName, int x, int y, int z){
this.worldName = worldName; this.worldName = worldName;
@@ -64,7 +62,10 @@ public class SimpleLocation implements Serializable {
} }
public SimpleLocation add(int x, int y, int z) { 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 @Override
@@ -79,13 +80,13 @@ public class SimpleLocation implements Serializable {
if (!Objects.equals(worldName, other.getWorldName())) { if (!Objects.equals(worldName, other.getWorldName())) {
return false; return false;
} }
if (Double.doubleToLongBits(this.x) != Double.doubleToLongBits(other.x)) { if (this.x != other.x) {
return false; return false;
} }
if (Double.doubleToLongBits(this.y) != Double.doubleToLongBits(other.y)) { if (this.y != other.y) {
return false; return false;
} }
if (Double.doubleToLongBits(this.z) != Double.doubleToLongBits(other.z)) { if (this.z != other.z) {
return false; return false;
} }
return true; return true;
@@ -94,9 +95,8 @@ public class SimpleLocation implements Serializable {
@Override @Override
public int hashCode() { public int hashCode() {
int hash = 3; int hash = 3;
//hash = 19 * hash + (worldName != null ? worldName.hashCode() : 0); hash = 7 * hash + (int) (Double.doubleToLongBits(this.x) ^ (Double.doubleToLongBits(this.x) >>> 32));
hash = 19 * 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.y) ^ (Double.doubleToLongBits(this.y) >>> 32));
hash = 19 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32)); hash = 19 * hash + (int) (Double.doubleToLongBits(this.z) ^ (Double.doubleToLongBits(this.z) >>> 32));
return hash; return hash;
} }
@@ -113,18 +113,23 @@ public class SimpleLocation implements Serializable {
return Bukkit.getWorld(worldName); return Bukkit.getWorld(worldName);
} }
public static SimpleLocation getByString(String location, String world) { public static SimpleLocation getByString(String location) {
String[] loc = location.split(","); String[] loc = location.split(",", 4);
return new SimpleLocation(world, Integer.parseInt(loc[0]), Integer.parseInt(loc[1]), Integer.parseInt(loc[2])); 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()); return new SimpleLocation(location.getWorld().getName(), location.getBlockX(), location.getBlockY(), location.getBlockZ());
} }
@Override @Override
public String toString() { 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) { public boolean isNear(SimpleLocation simpleLocation, int distance) {

View File

@@ -0,0 +1,67 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}
}

View File

@@ -0,0 +1,6 @@
package net.momirealms.customcrops.api.mechanic.world;
public interface Tickable {
void tick(int interval);
}

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -0,0 +1,105 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<WorldCrop> getCropAt(SimpleLocation location);
Optional<WorldSprinkler> getSprinklerAt(SimpleLocation location);
Optional<WorldPot> getPotAt(SimpleLocation location);
Optional<WorldGlass> getGlassAt(SimpleLocation location);
Optional<WorldScarecrow> getScarecrowAt(SimpleLocation location);
Optional<CustomCropsBlock> 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();
}

View File

@@ -15,22 +15,26 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
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}; int getSectionID();
private static final float[] rotationsF = {0f, 90f, 180f, -90f};
public static Rotation getRandomRotation() { CustomCropsBlock getBlockAt(ChunkPos pos);
return rotations4[new Random().nextInt(4)];
} CustomCropsBlock removeBlockAt(ChunkPos pos);
public static float getRandomFloatRotation() { CustomCropsBlock addBlockAt(ChunkPos pos, CustomCropsBlock block);
return rotationsF[new Random().nextInt(4)];
} boolean canPrune();
CustomCropsBlock[] getBlocks();
Map<ChunkPos, CustomCropsBlock> getBlockMap();
} }

View File

@@ -0,0 +1,114 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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<CustomCropsChunk> getChunkAt(ChunkCoordinate chunkCoordinate);
void loadChunk(CustomCropsChunk chunk);
void unloadChunk(ChunkCoordinate chunkCoordinate);
void setInfoData(WorldInfoData infoData);
WorldInfoData getInfoData();
@Nullable
Season getSeason();
Optional<WorldSprinkler> getSprinklerAt(SimpleLocation location);
Optional<WorldPot> getPotAt(SimpleLocation location);
Optional<WorldCrop> getCropAt(SimpleLocation location);
Optional<WorldGlass> getGlassAt(SimpleLocation location);
Optional<WorldScarecrow> getScarecrowAt(SimpleLocation location);
Optional<CustomCropsBlock> 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);
}

View File

@@ -0,0 +1,33 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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();
}

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldGlass extends CustomCropsBlock {
}

View File

@@ -0,0 +1,63 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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 +
'}';
}
}

View File

@@ -15,34 +15,31 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.mechanic.world.level;
/** import net.momirealms.customcrops.api.mechanic.item.Fertilizer;
* Fertilizer import net.momirealms.customcrops.api.mechanic.item.Pot;
*/ import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface CCFertilizer {
/** public interface WorldPot extends CustomCropsBlock {
* Reduce the fertilizer's usage times
* @return whether the fertilizer is used up
*/
boolean reduceTimes();
/**
* Get the fertilizer key in config
* @return key
*/
String getKey(); String getKey();
/** int getWater();
* Get the remaining usage times
* @return times
*/
int getLeftTimes();
/** void setWater(int water);
* Set remaining usage times
* @param times times Fertilizer getFertilizer();
*/
void setTimes(int times); void setFertilizer(Fertilizer fertilizer);
void removeFertilizer();
int getFertilizerTimes();
void setFertilizerTimes(int times);
Pot getConfig();
void tickWater(CustomCropsChunk chunk);
} }

View File

@@ -0,0 +1,23 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
package net.momirealms.customcrops.api.mechanic.world.level;
import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
public interface WorldScarecrow extends CustomCropsBlock {
}

View File

@@ -0,0 +1,191 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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;
}
}

View File

@@ -15,28 +15,18 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.mechanic.world.level;
/** import net.momirealms.customcrops.api.mechanic.item.Sprinkler;
* Sprinkler import net.momirealms.customcrops.api.mechanic.world.CustomCropsBlock;
*/
public interface CCSprinkler { public interface WorldSprinkler extends CustomCropsBlock {
/**
* Get the remaining water
* @return water amount
*/
int getWater(); int getWater();
/**
* Set the remaining water
* @param water water
*/
void setWater(int water); void setWater(int water);
/**
* Get the sprinkler config key
* @return sprinkler key
*/
String getKey(); String getKey();
Sprinkler getConfig();
} }

View File

@@ -0,0 +1,30 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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];
}
}

View File

@@ -1,67 +0,0 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -15,22 +15,19 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>. * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/ */
package net.momirealms.customcrops.api.object; package net.momirealms.customcrops.api.scheduler;
public interface CancellableTask {
/** /**
* Season * Cancel the task
*/ */
public interface CCWorldSeason { void cancel();
/** /**
* SPRING, SUMMER, AUTUMN, WINTER * Get if the task is cancelled or not
* @return season *
* @return cancelled or not
*/ */
String getSeason(); boolean isCancelled();
/**
* Get the season display name
* @return display name
*/
String getDisplay();
} }

View File

@@ -0,0 +1,93 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}

View File

@@ -0,0 +1,44 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}
}

View File

@@ -0,0 +1,78 @@
/*
* Copyright (C) <2022> <XiaoMoMi>
*
* 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 <https://www.gnu.org/licenses/>.
*/
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);
}
}

View File

@@ -8,7 +8,7 @@ plugins {
allprojects { allprojects {
project.group = "net.momirealms" project.group = "net.momirealms"
project.version = "3.3.1.16" project.version = "3.4.0.0"
apply<JavaPlugin>() apply<JavaPlugin>()
apply(plugin = "java") apply(plugin = "java")
@@ -21,8 +21,8 @@ allprojects {
} }
repositories { repositories {
maven("https://maven.aliyun.com/repository/public/")
mavenCentral() mavenCentral()
maven("https://maven.aliyun.com/repository/public/")
maven("https://betonquest.org/nexus/repository/betonquest/") maven("https://betonquest.org/nexus/repository/betonquest/")
maven("https://maven.enginehub.org/repo/") maven("https://maven.enginehub.org/repo/")
maven("https://oss.sonatype.org/content/groups/public/") maven("https://oss.sonatype.org/content/groups/public/")
@@ -40,21 +40,9 @@ allprojects {
maven("https://r.irepo.space/maven/") maven("https://r.irepo.space/maven/")
maven("https://repo.auxilor.io/repository/maven-public/") maven("https://repo.auxilor.io/repository/maven-public/")
maven("https://nexus.betonquest.org/repository/betonquest/") maven("https://nexus.betonquest.org/repository/betonquest/")
} maven("https://repo.infernalsuite.com/repository/maven-releases/")
maven("https://repo.rapture.pw/repository/maven-releases/")
dependencies { maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
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)
}
} }
} }

Some files were not shown because too many files have changed in this diff Show More