Compare commits
188 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
229c9e58c3 | ||
|
|
4f30a6e04e | ||
|
|
9ea45ee0d0 | ||
|
|
192316214d | ||
|
|
feb8898a87 | ||
|
|
1e64815e47 | ||
|
|
dc10648c25 | ||
|
|
70131a6cae | ||
|
|
6d23cc7141 | ||
|
|
473202527a | ||
|
|
bc24aaeb3c | ||
|
|
52072bd935 | ||
|
|
ad47b7898e | ||
|
|
19d6533db6 | ||
|
|
3a37d40271 | ||
|
|
cb3ccbb39a | ||
|
|
5c3bb678b3 | ||
|
|
4f4ee82e6b | ||
|
|
32d88f55f8 | ||
|
|
bc8d615079 | ||
|
|
55b7c3c16f | ||
|
|
9535986f59 | ||
|
|
fb17fc1383 | ||
|
|
4221368388 | ||
|
|
d4432d0cb8 | ||
|
|
f9093c2ed6 | ||
|
|
15f4d5c098 | ||
|
|
dc47bc7995 | ||
|
|
29ce0deb1b | ||
|
|
fd78402bf5 | ||
|
|
5f65e3f520 | ||
|
|
ceaf4d34a5 | ||
|
|
2d2e5f8150 | ||
|
|
323a4aefef | ||
|
|
af486580c1 | ||
|
|
7955a94f14 | ||
|
|
c99a1bd50a | ||
|
|
93364247de | ||
|
|
49612eddcb | ||
|
|
834c29f843 | ||
|
|
a806ac039d | ||
|
|
0ca2651af0 | ||
|
|
6157fdcfa1 | ||
|
|
36cfcd24c2 | ||
|
|
d4558db40c | ||
|
|
3f8448fee1 | ||
|
|
8b6e15457c | ||
|
|
b99e822db3 | ||
|
|
02f8d33a81 | ||
|
|
76042bea68 | ||
|
|
51ad09c536 | ||
|
|
264c591020 | ||
|
|
6bd3ca0f5c | ||
|
|
98df14a23a | ||
|
|
ccb6e38064 | ||
|
|
50f1ba6a19 | ||
|
|
501e7b05a6 | ||
|
|
ebf8abf764 | ||
|
|
aff8fa8e88 | ||
|
|
1accad88fe | ||
|
|
a3a5e4df38 | ||
|
|
6e8dc1d729 | ||
|
|
a8556008f9 | ||
|
|
ab18a8bd29 | ||
|
|
a053f512f8 | ||
|
|
add5390787 | ||
|
|
49687f9a91 | ||
|
|
5480c70f8c | ||
|
|
ef922f6d3f | ||
|
|
026bc55ffb | ||
|
|
270fdbb18c | ||
|
|
fbf5967d17 | ||
|
|
4102be1201 | ||
|
|
f6bdb9cc65 | ||
|
|
c8282d1acf | ||
|
|
b056b537ef | ||
|
|
f69b458731 | ||
|
|
b035fa8940 | ||
|
|
25c087592d | ||
|
|
083cb39771 | ||
|
|
eb3e0f5c09 | ||
|
|
08f43ddafd | ||
|
|
9d3efb5e83 | ||
|
|
8a5d1a604a | ||
|
|
ef67c6d6ae | ||
|
|
5b2654db15 | ||
|
|
eccd793317 | ||
|
|
1bc44755a0 | ||
|
|
ec606d9ebe | ||
|
|
c5556f15ab | ||
|
|
399cce21f5 | ||
|
|
b25feffdfa | ||
|
|
1a96fdf465 | ||
|
|
cee1ac4cc2 | ||
|
|
ac10fa46dc | ||
|
|
7c616e64ae | ||
|
|
708f9130c6 | ||
|
|
9118d49c67 | ||
|
|
a1ce72476f | ||
|
|
2cfab99644 | ||
|
|
cc9b3f7710 | ||
|
|
5bfe48c8d9 | ||
|
|
22ff157ffc | ||
|
|
720dbe789c | ||
|
|
b51dd51941 | ||
|
|
f3ffaa4cf6 | ||
|
|
085032e315 | ||
|
|
3d920ee2b4 | ||
|
|
06a04e4375 | ||
|
|
7349f15784 | ||
|
|
a4c77857d5 | ||
|
|
999fafc8df | ||
|
|
0d533850f6 | ||
|
|
569f9cfcb4 | ||
|
|
f0619f2374 | ||
|
|
7e8d97e11d | ||
|
|
d3414f25ad | ||
|
|
f0cf118448 | ||
|
|
297bb10b85 | ||
|
|
751624bc8d | ||
|
|
8b1b15a3e4 | ||
|
|
7fe330bafb | ||
|
|
20584b2a9b | ||
|
|
bd7594a117 | ||
|
|
f1bfa21270 | ||
|
|
01aa1e708a | ||
|
|
8424baa285 | ||
|
|
d9a8d26990 | ||
|
|
4d3eeaaefc | ||
|
|
d54a2b9516 | ||
|
|
f7f12b6255 | ||
|
|
42eb1344a6 | ||
|
|
4c2a8585cc | ||
|
|
8cccc67b0d | ||
|
|
396d74497c | ||
|
|
49602dce04 | ||
|
|
5da811ba74 | ||
|
|
a4d57e21fe | ||
|
|
4b8efdc79f | ||
|
|
610110efde | ||
|
|
a87f675269 | ||
|
|
a371d314b8 | ||
|
|
9a9097adc5 | ||
|
|
0669a57e4b | ||
|
|
692eaf6836 | ||
|
|
7f9052c64d | ||
|
|
55a841b3f5 | ||
|
|
85f02c5ca2 | ||
|
|
74c428b90d | ||
|
|
fd8c67fa66 | ||
|
|
a396754e2e | ||
|
|
6f97f47712 | ||
|
|
d1109e485a | ||
|
|
476e5c7cae | ||
|
|
dc2b7a6fda | ||
|
|
00f18519b0 | ||
|
|
f7ea5fd182 | ||
|
|
70d29c872a | ||
|
|
f79f4a84c3 | ||
|
|
9af63907ef | ||
|
|
c9aa92895b | ||
|
|
c57c824027 | ||
|
|
7cb905e65a | ||
|
|
31a2c7e338 | ||
|
|
1759b52f82 | ||
|
|
ccf93e3a4d | ||
|
|
abd07389ab | ||
|
|
80ad738bb2 | ||
|
|
b01105819a | ||
|
|
a7c08b0731 | ||
|
|
7e4c071698 | ||
|
|
f94f7ead08 | ||
|
|
b21c5bf3a9 | ||
|
|
7a9e8c5c10 | ||
|
|
a6ddbc46ab | ||
|
|
ffaee137d8 | ||
|
|
18d882dac6 | ||
|
|
52841f7f04 | ||
|
|
47b72e9243 | ||
|
|
854a10e8fd | ||
|
|
823ef6477b | ||
|
|
eccb146852 | ||
|
|
d877b707d6 | ||
|
|
bcb7401c74 | ||
|
|
f05c5f3cd6 | ||
|
|
3bd8bccb81 | ||
|
|
6f55787c84 | ||
|
|
eb4dc168fc |
@@ -1,38 +1,7 @@
|
|||||||
# How to contribute to eco
|
# How to contribute to eco
|
||||||
|
|
||||||
## Codestyle
|
Please open any Pull Requests into the `develop` branch or ideally into a new branch for your changes. PRs that go into `master` won't be ignored, but I have to checkout and merge manually, which makes your PR show as being closed.
|
||||||
|
|
||||||
1. The eco checkstyle is in /config/checkstyle.xml
|
Do not write any Kotlin-only APIs; all API components should be written in Java, Kotlin extensions should not have functionality that isn't available in java. The same applies the other way round, do not write any backend code in Java, it should be Kotlin-exclusive.
|
||||||
|
|
||||||
- The pull request must not have any checkstyle issues.
|
If you have any questions about contributing, feel free to ask in the [Discord](https://discord.gg/ZcwpSsE)!
|
||||||
- Every method and field must have a javadoc attached.
|
|
||||||
|
|
||||||
2. Use JetBrains annotations
|
|
||||||
|
|
||||||
- Every parameter should be annotated with @NotNull or @Nullable
|
|
||||||
|
|
||||||
3. Imports
|
|
||||||
|
|
||||||
- No group (*) imports.
|
|
||||||
- No static imports.
|
|
||||||
|
|
||||||
4. Kotlin
|
|
||||||
|
|
||||||
- Kotlin should be the only language used in the backend, java should be the only language used in the frontend.
|
|
||||||
- Kotlin API extensions should only be for creating extension functions and extra niceties that aren't possible in java.
|
|
||||||
Do not write API components in kotlin.
|
|
||||||
- Kotlin code should never be called directly from the frontend Java API. Kotlin API extensions should always rely on
|
|
||||||
java, not the other way round.
|
|
||||||
|
|
||||||
## Dependency Injection
|
|
||||||
|
|
||||||
- eco uses Dependency Injection
|
|
||||||
- Any calls to Eco#getHandler#getEcoPlugin are code smells and should never be used unless **absolutely necessary**.
|
|
||||||
- NamespacedKeys, FixedMetadataValues, Runnables, and Schedules should be managed using AbstractEcoPlugin through DI.
|
|
||||||
- Any DI class should extend PluginDependent where possible. If the class extends another, then you **must** store the
|
|
||||||
plugin instance in a private final variable called **plugin** with a private or protected getter.
|
|
||||||
|
|
||||||
## Other
|
|
||||||
|
|
||||||
- All drops **must** be sent through a DropQueue - calls to World#dropItem will get your PR rejected.
|
|
||||||
- eco is built with java 17.
|
|
||||||
48
README.md
48
README.md
@@ -1,5 +1,5 @@
|
|||||||
# eco
|
# eco
|
||||||
eco is a powerful Spigot development library that simplifies the process of plugin creation and supercharges
|
eco is a powerful Spigot plugin framework that simplifies the process of plugin creation and supercharges
|
||||||
your plugins.
|
your plugins.
|
||||||
It's the engine behind [EcoEnchants](https://polymart.org/resource/490), [Reforges](https://polymart.org/resource/1330),
|
It's the engine behind [EcoEnchants](https://polymart.org/resource/490), [Reforges](https://polymart.org/resource/1330),
|
||||||
[EcoItems](https://polymart.org/resource/1247), [EcoSkills](https://polymart.org/resource/1351),
|
[EcoItems](https://polymart.org/resource/1247), [EcoSkills](https://polymart.org/resource/1351),
|
||||||
@@ -16,30 +16,54 @@ and many more.
|
|||||||
<a href="https://bstats.org/plugin/bukkit/EcoEnchants" alt="bstats players">
|
<a href="https://bstats.org/plugin/bukkit/EcoEnchants" alt="bstats players">
|
||||||
<img src="https://img.shields.io/bstats/players/7666?color=informational"/>
|
<img src="https://img.shields.io/bstats/players/7666?color=informational"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://plugins.auxilor.io/" alt="Docs (gitbook)">
|
|
||||||
<img src="https://img.shields.io/badge/docs-gitbook-informational"/>
|
|
||||||
</a>
|
|
||||||
<a href="https://discord.gg/ZcwpSsE/" alt="Discord">
|
<a href="https://discord.gg/ZcwpSsE/" alt="Discord">
|
||||||
<img src="https://img.shields.io/discord/452518336627081236?label=discord&color=informational"/>
|
<img src="https://img.shields.io/discord/452518336627081236?label=discord&color=informational"/>
|
||||||
</a>
|
</a>
|
||||||
<a href="https://github.com/Auxilor/eco/actions/workflows/java-ci.yml" alt="Latest Dev Build">
|
<a href="https://github.com/Auxilor/eco/actions/workflows/java-ci.yml" alt="Latest Dev Build">
|
||||||
<img src="https://img.shields.io/github/workflow/status/Auxilor/eco/Java%20CI/develop?color=informational"/>
|
<img src="https://img.shields.io/github/actions/workflow/status/Auxilor/eco/java-ci.yml?branch=develop&color=informational"/>
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
eco comes packed with all the tools you need in your plugins:
|
||||||
|
|
||||||
|
- Modern command API
|
||||||
|
- Native color parsing with full hex/RGB/MiniMessage support
|
||||||
|
- Yaml/JSON/TOML config system
|
||||||
|
- Persistent data storage API with Yaml/MySQL/MongoDB support
|
||||||
|
- Packet item display system
|
||||||
|
- Lightweight event loop based packet API
|
||||||
|
- Entity AI API with near-1:1 NMS mappings
|
||||||
|
- More events
|
||||||
|
- Extension API, essentially plugins for plugins
|
||||||
|
- Fluent dependency injection for NamespacedKey, Metadata values, etc.
|
||||||
|
- Ultra-fast ItemStack reimplementation bypassing ItemMeta
|
||||||
|
- Complete GUI API with pre-made components available from [ecomponent](https://github.com/Auxilor/ecomponent)
|
||||||
|
- Over 30 native integrations for other plugins
|
||||||
|
- First-class custom item support with lookup strings
|
||||||
|
- Math expression parsing via [Crunch](https://github.com/Redempt/Crunch)
|
||||||
|
- Particle lookups
|
||||||
|
- Complete Placeholder API
|
||||||
|
- Price system, supporting economy plugins, XP, Items, etc.
|
||||||
|
- NMS/Version-specific tooling
|
||||||
|
- Custom crafting recipe API with support for stacks and custom items
|
||||||
|
- Native plugin update checking
|
||||||
|
- Native bStats support
|
||||||
|
- Full Kotlin support and native extensions
|
||||||
|
- Tooling to make meta-frameworks, like [libreforge](https://github.com/Auxilor/libreforge)
|
||||||
|
- And much more
|
||||||
|
|
||||||
# For server owners
|
# For server owners
|
||||||
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
|
|
||||||
- Supports 1.17+
|
- Supports 1.17+
|
||||||
|
|
||||||
## Downloads
|
## Downloads
|
||||||
|
|
||||||
- Stable (Recommended): [GitHub](https://github.com/Auxilor/eco/releases), [Polymart](https://polymart.org/resource/eco.773)
|
- Stable: [GitHub](https://github.com/Auxilor/eco/releases), [Polymart](https://polymart.org/resource/eco.773)
|
||||||
- Dev (Not Recommended): [GitHub](https://github.com/Auxilor/eco/actions/workflows/java-ci.yml) (Open latest run and download)
|
- Dev: [GitHub](https://github.com/Auxilor/eco/actions/workflows/java-ci.yml) (Open latest run and download)
|
||||||
|
|
||||||
# For developers
|
# For developers
|
||||||
|
|
||||||
## Javadoc
|
## Javadoc
|
||||||
The 6.45.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.45.0/javadoc/)
|
The 6.49.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.49.0/javadoc/)
|
||||||
|
|
||||||
## Plugin Information
|
## Plugin Information
|
||||||
|
|
||||||
@@ -68,7 +92,7 @@ dependencies {
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace `Tag` with a release tag for eco, eg `6.45.0`.
|
Replace `Tag` with a release tag for eco, eg `6.49.0`.
|
||||||
|
|
||||||
Maven:
|
Maven:
|
||||||
|
|
||||||
@@ -88,7 +112,7 @@ Maven:
|
|||||||
</dependency>
|
</dependency>
|
||||||
```
|
```
|
||||||
|
|
||||||
Replace `Tag` with a release tag for eco, eg `6.45.0`.
|
Replace `Tag` with a release tag for eco, eg `6.49.0`.
|
||||||
|
|
||||||
## Build locally:
|
## Build locally:
|
||||||
|
|
||||||
@@ -103,7 +127,7 @@ cd eco
|
|||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
*Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
|
eco is licensed under GNU GPL3. *Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
|
||||||
|
|
||||||
<h1 align="center">
|
<h1 align="center">
|
||||||
Check out our partners!
|
Check out our partners!
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ dependencies {
|
|||||||
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
|
implementation(project(path = ":eco-core:core-nms:v1_18_R1", configuration = "reobf"))
|
||||||
implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf"))
|
implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf"))
|
||||||
implementation(project(path = ":eco-core:core-nms:v1_19_R1", configuration = "reobf"))
|
implementation(project(path = ":eco-core:core-nms:v1_19_R1", configuration = "reobf"))
|
||||||
|
implementation(project(path = ":eco-core:core-nms:v1_19_R2", configuration = "reobf"))
|
||||||
|
implementation(project(path = ":eco-core:core-nms:v1_19_R3", configuration = "reobf"))
|
||||||
}
|
}
|
||||||
|
|
||||||
allprojects {
|
allprojects {
|
||||||
@@ -55,7 +57,7 @@ allprojects {
|
|||||||
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
||||||
|
|
||||||
// ProtocolLib
|
// ProtocolLib
|
||||||
maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
//maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
||||||
|
|
||||||
// WorldGuard
|
// WorldGuard
|
||||||
maven("https://maven.enginehub.org/repo/")
|
maven("https://maven.enginehub.org/repo/")
|
||||||
@@ -77,6 +79,9 @@ allprojects {
|
|||||||
|
|
||||||
// LibsDisguises
|
// LibsDisguises
|
||||||
maven("https://repo.md-5.net/content/groups/public/")
|
maven("https://repo.md-5.net/content/groups/public/")
|
||||||
|
|
||||||
|
// UltraEconomy
|
||||||
|
maven("https://repo.techscode.com/repository/maven-releases/")
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|||||||
@@ -1,38 +0,0 @@
|
|||||||
dependencies {
|
|
||||||
// Adventure
|
|
||||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.1.0'
|
|
||||||
|
|
||||||
// Other
|
|
||||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
|
||||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
|
||||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
|
||||||
}
|
|
||||||
|
|
||||||
group 'com.willfp'
|
|
||||||
version rootProject.version
|
|
||||||
|
|
||||||
java {
|
|
||||||
withJavadocJar()
|
|
||||||
}
|
|
||||||
|
|
||||||
build.dependsOn publishToMavenLocal
|
|
||||||
|
|
||||||
publishing {
|
|
||||||
publications {
|
|
||||||
shadow(MavenPublication) {
|
|
||||||
from components.java
|
|
||||||
artifactId 'eco'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
repositories {
|
|
||||||
maven {
|
|
||||||
name = "GitHubPackages"
|
|
||||||
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
|
||||||
credentials {
|
|
||||||
username = System.getenv("GITHUB_ACTOR")
|
|
||||||
password = System.getenv("GITHUB_TOKEN")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
42
eco-api/build.gradle.kts
Normal file
42
eco-api/build.gradle.kts
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
dependencies {
|
||||||
|
// Adventure
|
||||||
|
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")
|
||||||
|
|
||||||
|
// Other
|
||||||
|
compileOnly("org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT")
|
||||||
|
compileOnly("com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT")
|
||||||
|
compileOnly("com.google.code.gson:gson:2.8.8")
|
||||||
|
}
|
||||||
|
|
||||||
|
group = "com.willfp"
|
||||||
|
version = rootProject.version
|
||||||
|
|
||||||
|
java {
|
||||||
|
withJavadocJar()
|
||||||
|
}
|
||||||
|
|
||||||
|
tasks {
|
||||||
|
build {
|
||||||
|
dependsOn(publishToMavenLocal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
publishing {
|
||||||
|
publications {
|
||||||
|
create<MavenPublication>("shadow") {
|
||||||
|
from(components["java"])
|
||||||
|
artifactId = "eco"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
repositories {
|
||||||
|
maven {
|
||||||
|
name = "GitHubPackages"
|
||||||
|
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
||||||
|
credentials {
|
||||||
|
username = System.getenv("GITHUB_ACTOR")
|
||||||
|
password = System.getenv("GITHUB_TOKEN")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -13,27 +13,30 @@ import java.util.Collections;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Wrapper class for ProtocolLib packets.
|
* Wrapper class for ProtocolLib packets.
|
||||||
|
*
|
||||||
|
* @deprecated ProtocolLib is no longer used by eco. Use {@link com.willfp.eco.core.packet.PacketListener} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.51.0")
|
||||||
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||||
/**
|
/**
|
||||||
* The packet type to listen for.
|
* The handle type to listen for.
|
||||||
*/
|
*/
|
||||||
private final PacketType type;
|
private final PacketType type;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Whether the packet adapter should be registered after the server has loaded.
|
* Whether the handle adapter should be registered after the server has loaded.
|
||||||
* <p>
|
* <p>
|
||||||
* Useful for monitor priority adapters that <b>must</b> be ran last.
|
* Useful for monitor priority adapters that <b>must</b> be ran last.
|
||||||
*/
|
*/
|
||||||
private final boolean postLoad;
|
private final boolean postLoad;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new packet adapter for a specified plugin and type.
|
* Create a new handle adapter for a specified plugin and type.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
||||||
* @param type The {@link PacketType} to listen for.
|
* @param type The {@link PacketType} to listen for.
|
||||||
* @param priority The priority at which the adapter should be ran on packet send/receive.
|
* @param priority The priority at which the adapter should be ran on handle send/receive.
|
||||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
* @param postLoad If the handle adapter should be registered after the server has loaded.
|
||||||
*/
|
*/
|
||||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final PacketType type,
|
@NotNull final PacketType type,
|
||||||
@@ -45,11 +48,11 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new packet adapter for a specified plugin and type.
|
* Create a new handle adapter for a specified plugin and type.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
||||||
* @param type The {@link PacketType} to listen for.
|
* @param type The {@link PacketType} to listen for.
|
||||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
* @param postLoad If the handle adapter should be registered after the server has loaded.
|
||||||
*/
|
*/
|
||||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final PacketType type,
|
@NotNull final PacketType type,
|
||||||
@@ -58,9 +61,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The code that should be executed once the packet has been received.
|
* The code that should be executed once the handle has been received.
|
||||||
*
|
*
|
||||||
* @param packet The packet.
|
* @param packet The handle.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
* @param event The event.
|
* @param event The event.
|
||||||
*/
|
*/
|
||||||
@@ -71,9 +74,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* THe code that should be executed once the packet has been sent.
|
* THe code that should be executed once the handle has been sent.
|
||||||
*
|
*
|
||||||
* @param packet The packet.
|
* @param packet The handle.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
* @param event The event.
|
* @param event The event.
|
||||||
*/
|
*/
|
||||||
@@ -84,7 +87,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boilerplate to assert that the packet is of the specified type.
|
* Boilerplate to assert that the handle is of the specified type.
|
||||||
*
|
*
|
||||||
* @param event The ProtocolLib event.
|
* @param event The ProtocolLib event.
|
||||||
*/
|
*/
|
||||||
@@ -102,7 +105,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boilerplate to assert that the packet is of the specified type.
|
* Boilerplate to assert that the handle is of the specified type.
|
||||||
*
|
*
|
||||||
* @param event The ProtocolLib event.
|
* @param event The ProtocolLib event.
|
||||||
*/
|
*/
|
||||||
@@ -125,7 +128,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the packet adapter with ProtocolLib.
|
* Register the handle adapter with ProtocolLib.
|
||||||
*/
|
*/
|
||||||
public final void register() {
|
public final void register() {
|
||||||
if (!ProtocolLibrary.getProtocolManager().getPacketListeners().contains(this)) {
|
if (!ProtocolLibrary.getProtocolManager().getPacketListeners().contains(this)) {
|
||||||
@@ -134,7 +137,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get if the packet adapter should be loaded last.
|
* Get if the handle adapter should be loaded last.
|
||||||
*
|
*
|
||||||
* @return If post load.
|
* @return If post load.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.willfp.eco.core;
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.command.CommandBase;
|
||||||
|
import com.willfp.eco.core.command.PluginCommandBase;
|
||||||
|
import com.willfp.eco.core.command.impl.PluginCommand;
|
||||||
import com.willfp.eco.core.config.ConfigType;
|
import com.willfp.eco.core.config.ConfigType;
|
||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
@@ -23,6 +26,7 @@ import com.willfp.eco.core.gui.slot.SlotBuilder;
|
|||||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||||
import com.willfp.eco.core.items.TestableItem;
|
import com.willfp.eco.core.items.TestableItem;
|
||||||
import com.willfp.eco.core.math.MathContext;
|
import com.willfp.eco.core.math.MathContext;
|
||||||
|
import com.willfp.eco.core.packet.Packet;
|
||||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||||
@@ -47,18 +51,18 @@ import java.util.UUID;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Holds the instance of eco for bridging between the frontend
|
* Holds the instance of eco for bridging between the frontend and backend.
|
||||||
* and backend.
|
|
||||||
* <p>
|
* <p>
|
||||||
* <strong>Do not use this in your plugins!</strong> It can and will contain
|
* <strong>Do not use this in your plugins!</strong> It can and will contain
|
||||||
* breaking changes between minor versions and even patches, and you will create
|
* breaking changes between minor versions and even patches, and you will create compatibility
|
||||||
* compatibility issues by. All parts of this have been abstracted
|
* issues by. All parts of this have been abstracted into logically named API components that you
|
||||||
* into logically named API components that you can use.
|
* can use.
|
||||||
*
|
*
|
||||||
* @see Eco#get()
|
* @see Eco#get()
|
||||||
*/
|
*/
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
public interface Eco {
|
public interface Eco {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a scheduler.
|
* Create a scheduler.
|
||||||
*
|
*
|
||||||
@@ -71,7 +75,7 @@ public interface Eco {
|
|||||||
/**
|
/**
|
||||||
* Create an event manager.
|
* Create an event manager.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.F
|
||||||
* @return The event manager.
|
* @return The event manager.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -155,6 +159,40 @@ public interface Eco {
|
|||||||
@NotNull
|
@NotNull
|
||||||
EcoPlugin getEcoPlugin();
|
EcoPlugin getEcoPlugin();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create PluginCommandBase implementation of {@link PluginCommand}.
|
||||||
|
*
|
||||||
|
* @param parentDelegate the enclosing class of this implementation.
|
||||||
|
* @param plugin the plugin.
|
||||||
|
* @param name the name of the command.
|
||||||
|
* @param permission the permission of the command.
|
||||||
|
* @param playersOnly if the command is players only.
|
||||||
|
* @return The PluginCommandBase implementation
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
PluginCommandBase createPluginCommand(@NotNull CommandBase parentDelegate,
|
||||||
|
@NotNull EcoPlugin plugin,
|
||||||
|
@NotNull String name,
|
||||||
|
@NotNull String permission,
|
||||||
|
boolean playersOnly);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create CommandBase implementation of {@link com.willfp.eco.core.command.impl.Subcommand Subcommand}.
|
||||||
|
*
|
||||||
|
* @param parentDelegate the enclosing class of this implementation.
|
||||||
|
* @param plugin the plugin.
|
||||||
|
* @param name the name of the command.
|
||||||
|
* @param permission the permission of the command.
|
||||||
|
* @param playersOnly if the command is players only.
|
||||||
|
* @return The CommandBase implementation
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
CommandBase createSubcommand(@NotNull CommandBase parentDelegate,
|
||||||
|
@NotNull EcoPlugin plugin,
|
||||||
|
@NotNull String name,
|
||||||
|
@NotNull String permission,
|
||||||
|
boolean playersOnly);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updatable config.
|
* Updatable config.
|
||||||
*
|
*
|
||||||
@@ -376,9 +414,8 @@ public interface Eco {
|
|||||||
/**
|
/**
|
||||||
* Create a {@link NamespacedKey} quickly
|
* Create a {@link NamespacedKey} quickly
|
||||||
* <p>
|
* <p>
|
||||||
* Bypasses the constructor, allowing for the creation of invalid keys,
|
* Bypasses the constructor, allowing for the creation of invalid keys, therefore this is
|
||||||
* therefore this is considered unsafe and should only be called after
|
* considered unsafe and should only be called after the key has been confirmed to be valid.
|
||||||
* the key has been confirmed to be valid.
|
|
||||||
*
|
*
|
||||||
* @param namespace The namespace.
|
* @param namespace The namespace.
|
||||||
* @param key The key.
|
* @param key The key.
|
||||||
@@ -511,8 +548,23 @@ public interface Eco {
|
|||||||
void syncCommands();
|
void syncCommands();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the instance of eco; the bridge between the api frontend
|
* Unregister a command.
|
||||||
* and the implementation backend.
|
*
|
||||||
|
* @param command The command.
|
||||||
|
*/
|
||||||
|
void unregisterCommand(@NotNull PluginCommandBase command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Send a packet.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @param packet The packet.
|
||||||
|
*/
|
||||||
|
void sendPacket(@NotNull Player player,
|
||||||
|
@NotNull Packet packet);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the instance of eco; the bridge between the api frontend and the implementation backend.
|
||||||
*
|
*
|
||||||
* @return The instance of eco.
|
* @return The instance of eco.
|
||||||
*/
|
*/
|
||||||
@@ -526,6 +578,7 @@ public interface Eco {
|
|||||||
*/
|
*/
|
||||||
@ApiStatus.Internal
|
@ApiStatus.Internal
|
||||||
final class Instance {
|
final class Instance {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Instance of eco.
|
* Instance of eco.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -13,7 +13,11 @@ import com.willfp.eco.core.factory.MetadataValueFactory;
|
|||||||
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||||
import com.willfp.eco.core.factory.RunnableFactory;
|
import com.willfp.eco.core.factory.RunnableFactory;
|
||||||
import com.willfp.eco.core.integrations.IntegrationLoader;
|
import com.willfp.eco.core.integrations.IntegrationLoader;
|
||||||
|
import com.willfp.eco.core.map.ListMap;
|
||||||
|
import com.willfp.eco.core.packet.PacketListener;
|
||||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
|
import com.willfp.eco.core.registry.Registrable;
|
||||||
|
import com.willfp.eco.core.registry.Registry;
|
||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import com.willfp.eco.core.web.UpdateChecker;
|
import com.willfp.eco.core.web.UpdateChecker;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
@@ -52,27 +56,12 @@ import java.util.stream.Collectors;
|
|||||||
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
||||||
* be cancelled.</b>
|
* be cancelled.</b>
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings({"unused", "DeprecatedIsStillUsed", "deprecation", "RedundantSuppression", "MismatchedQueryAndUpdateOfCollection"})
|
||||||
public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Registrable {
|
||||||
/**
|
/**
|
||||||
* The polymart resource ID of the plugin.
|
* The properties (eco.yml).
|
||||||
*/
|
*/
|
||||||
private final int resourceId;
|
private final PluginProps props;
|
||||||
|
|
||||||
/**
|
|
||||||
* The bStats resource ID of the plugin.
|
|
||||||
*/
|
|
||||||
private final int bStatsId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The package where proxy implementations are.
|
|
||||||
*/
|
|
||||||
private final String proxyPackage;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The color of the plugin, used in messages.
|
|
||||||
*/
|
|
||||||
private final String color;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Loaded integrations.
|
* Loaded integrations.
|
||||||
@@ -141,11 +130,6 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*/
|
*/
|
||||||
private boolean outdated = false;
|
private boolean outdated = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* If the plugin supports extensions.
|
|
||||||
*/
|
|
||||||
private final boolean supportingExtensions;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The proxy factory.
|
* The proxy factory.
|
||||||
*/
|
*/
|
||||||
@@ -155,27 +139,27 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
/**
|
/**
|
||||||
* The tasks to run on enable.
|
* The tasks to run on enable.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onEnable = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onEnable = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on disable.
|
* The tasks to run on disable.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onDisable = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onDisable = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on reload.
|
* The tasks to run on reload.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onReload = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onReload = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run on load.
|
* The tasks to run on load.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> onLoad = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> onLoad = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The tasks to run after load.
|
* The tasks to run after load.
|
||||||
*/
|
*/
|
||||||
private final List<Runnable> afterLoad = new ArrayList<>();
|
private final ListMap<LifecyclePosition, Runnable> afterLoad = new ListMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new plugin.
|
* Create a new plugin.
|
||||||
@@ -192,7 +176,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* Create a new plugin without proxy support, polymart, or bStats.
|
* Create a new plugin without proxy support, polymart, or bStats.
|
||||||
*
|
*
|
||||||
* @param color The color.
|
* @param color The color.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(@NotNull final String color) {
|
protected EcoPlugin(@NotNull final String color) {
|
||||||
this("", color);
|
this("", color);
|
||||||
}
|
}
|
||||||
@@ -203,7 +189,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*
|
*
|
||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(@NotNull final String proxyPackage,
|
protected EcoPlugin(@NotNull final String proxyPackage,
|
||||||
@NotNull final String color) {
|
@NotNull final String color) {
|
||||||
this(0, 0, proxyPackage, color);
|
this(0, 0, proxyPackage, color);
|
||||||
@@ -215,7 +203,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param resourceId The polymart resource ID for the plugin.
|
* @param resourceId The polymart resource ID for the plugin.
|
||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String color) {
|
@NotNull final String color) {
|
||||||
@@ -229,7 +219,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
* @param supportingExtensions If the plugin supports extensions.
|
* @param supportingExtensions If the plugin supports extensions.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String color,
|
@NotNull final String color,
|
||||||
@@ -244,7 +236,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param bStatsId The bStats resource ID for the plugin.
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
@@ -260,21 +254,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param proxyPackage The package where proxy implementations are stored.
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
* @param supportingExtensions If the plugin supports extensions.
|
* @param supportingExtensions If the plugin supports extensions.
|
||||||
|
* @deprecated Use eco.yml instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
protected EcoPlugin(final int resourceId,
|
protected EcoPlugin(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
@NotNull final String color,
|
@NotNull final String color,
|
||||||
final boolean supportingExtensions) {
|
final boolean supportingExtensions) {
|
||||||
this(
|
this(PluginProps.createSimple(resourceId, bStatsId, proxyPackage, color, supportingExtensions));
|
||||||
PluginProps.createSimple(
|
|
||||||
resourceId,
|
|
||||||
bStatsId,
|
|
||||||
proxyPackage,
|
|
||||||
color,
|
|
||||||
supportingExtensions
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -324,13 +312,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
PluginProps props = this.mutateProps(generatedProps);
|
PluginProps props = this.mutateProps(generatedProps);
|
||||||
props.validate();
|
props.validate();
|
||||||
|
|
||||||
this.resourceId = props.getResourceId();
|
this.props = props;
|
||||||
this.bStatsId = props.getBStatsId();
|
|
||||||
this.proxyPackage = props.getProxyPackage();
|
|
||||||
this.color = props.getColor();
|
|
||||||
this.supportingExtensions = props.isSupportingExtensions();
|
|
||||||
|
|
||||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
this.proxyFactory = this.props.getProxyPackage().equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
||||||
this.logger = Eco.get().createLogger(this);
|
this.logger = Eco.get().createLogger(this);
|
||||||
|
|
||||||
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
||||||
@@ -344,6 +328,13 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.configHandler = Eco.get().createConfigHandler(this);
|
this.configHandler = Eco.get().createConfigHandler(this);
|
||||||
|
|
||||||
this.langYml = this.createLangYml();
|
this.langYml = this.createLangYml();
|
||||||
|
|
||||||
|
if (!this.langYml.isValid() && !(this instanceof Eco)) {
|
||||||
|
this.getLogger().warning("Notify plugin authors " + String.join(", ", this.getDescription().getAuthors()) + " that");
|
||||||
|
this.getLogger().warning("they are missing crucial lang.yml keys! They can be found");
|
||||||
|
this.getLogger().warning("in the LangYml class.");
|
||||||
|
}
|
||||||
|
|
||||||
this.configYml = this.createConfigYml();
|
this.configYml = this.createConfigYml();
|
||||||
|
|
||||||
Eco.get().addNewPlugin(this);
|
Eco.get().addNewPlugin(this);
|
||||||
@@ -393,10 +384,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
Eco.get().registerBStats(this);
|
Eco.get().registerBStats(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).map(String::toLowerCase).collect(Collectors.toSet());
|
||||||
.map(Plugin::getName)
|
|
||||||
.map(String::toLowerCase)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
|
|
||||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||||
Eco.get().createPAPIIntegration(this);
|
Eco.get().createPAPIIntegration(this);
|
||||||
@@ -415,13 +403,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
|
|
||||||
Prerequisite.update();
|
Prerequisite.update();
|
||||||
|
|
||||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
|
||||||
if (!abstractPacketAdapter.isPostLoad()) {
|
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||||
abstractPacketAdapter.register();
|
if (!abstractPacketAdapter.isPostLoad()) {
|
||||||
}
|
abstractPacketAdapter.register();
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
||||||
|
this.loadPacketListeners().forEach(listener -> this.getEventManager().registerPacketListener(listener));
|
||||||
|
|
||||||
this.loadPluginCommands().forEach(PluginCommand::register);
|
this.loadPluginCommands().forEach(PluginCommand::register);
|
||||||
|
|
||||||
@@ -438,8 +429,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.onEnable.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleEnable();
|
this.handleEnable();
|
||||||
this.onEnable.forEach(Runnable::run);
|
this.onEnable.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
this.getLogger().info("");
|
this.getLogger().info("");
|
||||||
}
|
}
|
||||||
@@ -450,7 +442,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onEnable(@NotNull final Runnable task) {
|
public final void onEnable(@NotNull final Runnable task) {
|
||||||
this.onEnable.add(task);
|
this.onEnable(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on enable.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onEnable(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onEnable.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -463,8 +466,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getEventManager().unregisterAllListeners();
|
this.getEventManager().unregisterAllListeners();
|
||||||
this.getScheduler().cancelAll();
|
this.getScheduler().cancelAll();
|
||||||
|
|
||||||
|
this.onDisable.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleDisable();
|
this.handleDisable();
|
||||||
this.onDisable.forEach(Runnable::run);
|
this.onDisable.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
if (this.isSupportingExtensions()) {
|
if (this.isSupportingExtensions()) {
|
||||||
this.getExtensionLoader().unloadExtensions();
|
this.getExtensionLoader().unloadExtensions();
|
||||||
@@ -480,7 +484,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onDisable(@NotNull final Runnable task) {
|
public final void onDisable(@NotNull final Runnable task) {
|
||||||
this.onDisable.add(task);
|
this.onDisable(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on disable.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onDisable(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onDisable.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -490,8 +505,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
public final void onLoad() {
|
public final void onLoad() {
|
||||||
super.onLoad();
|
super.onLoad();
|
||||||
|
|
||||||
|
this.onLoad.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleLoad();
|
this.handleLoad();
|
||||||
this.onLoad.forEach(Runnable::run);
|
this.onLoad.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -500,7 +516,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onLoad(@NotNull final Runnable task) {
|
public final void onLoad(@NotNull final Runnable task) {
|
||||||
this.onLoad.add(task);
|
this.onLoad(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on load.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onLoad(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onLoad.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -513,11 +540,13 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
Display.registerDisplayModule(this.getDisplayModule());
|
Display.registerDisplayModule(this.getDisplayModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
|
||||||
if (abstractPacketAdapter.isPostLoad()) {
|
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||||
abstractPacketAdapter.register();
|
if (abstractPacketAdapter.isPostLoad()) {
|
||||||
}
|
abstractPacketAdapter.register();
|
||||||
});
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (!Prerequisite.HAS_PAPER.isMet()) {
|
if (!Prerequisite.HAS_PAPER.isMet()) {
|
||||||
this.getLogger().severe("");
|
this.getLogger().severe("");
|
||||||
@@ -532,8 +561,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getLogger().severe("");
|
this.getLogger().severe("");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this.afterLoad.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleAfterLoad();
|
this.handleAfterLoad();
|
||||||
this.afterLoad.forEach(Runnable::run);
|
this.afterLoad.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
this.reload();
|
this.reload();
|
||||||
|
|
||||||
@@ -541,7 +571,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
extension.handleAfterLoad();
|
extension.handleAfterLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getLogger().info("Loaded " + this.color + this.getName());
|
this.getLogger().info("Loaded " + this.props.getColor() + this.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -550,7 +580,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void afterLoad(@NotNull final Runnable task) {
|
public final void afterLoad(@NotNull final Runnable task) {
|
||||||
this.afterLoad.add(task);
|
this.afterLoad(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run after load.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void afterLoad(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.afterLoad.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -563,8 +604,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
this.getConfigHandler().callUpdate();
|
this.getConfigHandler().callUpdate();
|
||||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||||
|
|
||||||
|
this.onReload.get(LifecyclePosition.START).forEach(Runnable::run);
|
||||||
this.handleReload();
|
this.handleReload();
|
||||||
this.onReload.forEach(Runnable::run);
|
this.onReload.get(LifecyclePosition.END).forEach(Runnable::run);
|
||||||
|
|
||||||
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
|
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
|
||||||
extension.handleReload();
|
extension.handleReload();
|
||||||
@@ -572,12 +614,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Add new task to run on enable.
|
* Add new task to run on reload.
|
||||||
*
|
*
|
||||||
* @param task The task.
|
* @param task The task.
|
||||||
*/
|
*/
|
||||||
public final void onReload(@NotNull final Runnable task) {
|
public final void onReload(@NotNull final Runnable task) {
|
||||||
this.onReload.add(task);
|
this.onReload(LifecyclePosition.END, task);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new task to run on reload.
|
||||||
|
*
|
||||||
|
* @param position The position to run the task.
|
||||||
|
* @param task The task.
|
||||||
|
*/
|
||||||
|
public final void onReload(@NotNull final LifecyclePosition position,
|
||||||
|
@NotNull final Runnable task) {
|
||||||
|
this.onReload.append(position, task);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -674,22 +727,35 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ProtocolLib packet adapters to be registered.
|
* ProtocolLib handle adapters to be registered.
|
||||||
* <p>
|
* <p>
|
||||||
* If the plugin does not require ProtocolLib this can be left empty.
|
* If the plugin does not require ProtocolLib this can be left empty.
|
||||||
*
|
*
|
||||||
* @return A list of packet adapters.
|
* @return A list of handle adapters.
|
||||||
|
* @deprecated Use {@link #loadPacketListeners()} instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.51.0")
|
||||||
protected List<AbstractPacketAdapter> loadPacketAdapters() {
|
protected List<AbstractPacketAdapter> loadPacketAdapters() {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Packet Listeners to be registered.
|
||||||
|
*
|
||||||
|
* @return A list of handle listeners.
|
||||||
|
*/
|
||||||
|
protected List<PacketListener> loadPacketListeners() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All listeners to be registered.
|
* All listeners to be registered.
|
||||||
*
|
*
|
||||||
* @return A list of all listeners.
|
* @return A list of all listeners.
|
||||||
*/
|
*/
|
||||||
protected abstract List<Listener> loadListeners();
|
protected List<Listener> loadListeners() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Useful for custom LangYml implementations.
|
* Useful for custom LangYml implementations.
|
||||||
@@ -699,7 +765,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return lang.yml.
|
* @return lang.yml.
|
||||||
*/
|
*/
|
||||||
protected LangYml createLangYml() {
|
protected LangYml createLangYml() {
|
||||||
return new LangYml(this);
|
try {
|
||||||
|
return new LangYml(this);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
this.getLogger().severe("Failed to load lang.yml!");
|
||||||
|
this.getLogger().severe("For the developer of this plugin: make sure you have a lang.yml");
|
||||||
|
e.printStackTrace();
|
||||||
|
Bukkit.getPluginManager().disablePlugin(this);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -710,7 +784,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return config.yml.
|
* @return config.yml.
|
||||||
*/
|
*/
|
||||||
protected ConfigYml createConfigYml() {
|
protected ConfigYml createConfigYml() {
|
||||||
return new ConfigYml(this);
|
try {
|
||||||
|
return new ConfigYml(this);
|
||||||
|
} catch (NullPointerException e) {
|
||||||
|
this.getLogger().severe("Failed to load config.yml!");
|
||||||
|
this.getLogger().severe("For the developer of this plugin: make sure you have a config.yml");
|
||||||
|
e.printStackTrace();
|
||||||
|
Bukkit.getPluginManager().disablePlugin(this);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -720,10 +802,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
protected DisplayModule createDisplayModule() {
|
protected DisplayModule createDisplayModule() {
|
||||||
Validate.isTrue(
|
Validate.isTrue(this.getDisplayModule() == null, "Display module exists!");
|
||||||
this.getDisplayModule() == null,
|
|
||||||
"Display module exists!"
|
|
||||||
);
|
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -822,6 +901,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @param pluginName The name.
|
* @param pluginName The name.
|
||||||
* @return The plugin.
|
* @return The plugin.
|
||||||
*/
|
*/
|
||||||
|
@Nullable
|
||||||
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||||
return Eco.get().getPluginByName(pluginName);
|
return Eco.get().getPluginByName(pluginName);
|
||||||
}
|
}
|
||||||
@@ -831,17 +911,28 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
*
|
*
|
||||||
* @return The set of names.
|
* @return The set of names.
|
||||||
*/
|
*/
|
||||||
|
@NotNull
|
||||||
public static Set<String> getPluginNames() {
|
public static Set<String> getPluginNames() {
|
||||||
return new HashSet<>(Eco.get().getLoadedPlugins());
|
return new HashSet<>(Eco.get().getLoadedPlugins());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin props. (eco.yml).
|
||||||
|
*
|
||||||
|
* @return The props.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public PluginProps getProps() {
|
||||||
|
return this.props;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the polymart resource ID.
|
* Get the polymart resource ID.
|
||||||
*
|
*
|
||||||
* @return The resource ID.
|
* @return The resource ID.
|
||||||
*/
|
*/
|
||||||
public int getResourceId() {
|
public int getResourceId() {
|
||||||
return this.resourceId;
|
return this.getProps().getResourceId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -850,7 +941,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The ID.
|
* @return The ID.
|
||||||
*/
|
*/
|
||||||
public int getBStatsId() {
|
public int getBStatsId() {
|
||||||
return this.bStatsId;
|
return this.getProps().getBStatsId();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -859,7 +950,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The package where proxies are contained.
|
* @return The package where proxies are contained.
|
||||||
*/
|
*/
|
||||||
public String getProxyPackage() {
|
public String getProxyPackage() {
|
||||||
return this.proxyPackage;
|
return this.getProps().getProxyPackage();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -868,7 +959,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return The color.
|
* @return The color.
|
||||||
*/
|
*/
|
||||||
public String getColor() {
|
public String getColor() {
|
||||||
return this.color;
|
return this.getProps().getColor();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -986,7 +1077,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
* @return If extensions are supported.
|
* @return If extensions are supported.
|
||||||
*/
|
*/
|
||||||
public boolean isSupportingExtensions() {
|
public boolean isSupportingExtensions() {
|
||||||
return this.supportingExtensions;
|
return this.getProps().isSupportingExtensions();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -1020,4 +1111,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
|||||||
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
||||||
return this.getMetadataValueFactory().create(value);
|
return this.getMetadataValueFactory().create(value);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@NotNull
|
||||||
|
public final String getID() {
|
||||||
|
return Registry.tryFitPattern(this.getName());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,16 @@
|
|||||||
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Marks a position in a lifecycle (e.g. enable, reload, etc).
|
||||||
|
*/
|
||||||
|
public enum LifecyclePosition {
|
||||||
|
/**
|
||||||
|
* Run at the start of the lifecycle.
|
||||||
|
*/
|
||||||
|
START,
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run at the end of the lifecycle.
|
||||||
|
*/
|
||||||
|
END
|
||||||
|
}
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
package com.willfp.eco.core;
|
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Quick DI class to manage passing eco plugins.
|
|
||||||
* <p>
|
|
||||||
* Basically just a quick bit of laziness if you can't be bothered to add a private field
|
|
||||||
* and a protected getter, don't use this in kotlin as you can just specify
|
|
||||||
* {@code
|
|
||||||
* private val plugin: EcoPlugin
|
|
||||||
* }
|
|
||||||
* in the constructor.
|
|
||||||
*
|
|
||||||
* @param <T> The eco plugin type.
|
|
||||||
* @deprecated Leaky inheritance, shouldn't exist.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
public abstract class PluginDependent<T extends EcoPlugin> {
|
|
||||||
/**
|
|
||||||
* The {@link EcoPlugin} that is stored.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
private final T plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin to manage.
|
|
||||||
*/
|
|
||||||
protected PluginDependent(@NotNull final T plugin) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the plugin.
|
|
||||||
*
|
|
||||||
* @return The plugin.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
protected T getPlugin() {
|
|
||||||
return this.plugin;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -49,6 +49,16 @@ public final class PluginProps {
|
|||||||
@Nullable
|
@Nullable
|
||||||
private Boolean supportingExtensions;
|
private Boolean supportingExtensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The environment variables.
|
||||||
|
*/
|
||||||
|
private final Map<String, String> environment = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the plugin uses reflective reload (via {@link com.willfp.eco.core.config.updating.ConfigUpdater}).
|
||||||
|
*/
|
||||||
|
private boolean usesReflectiveReload = true;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new blank props.
|
* Create new blank props.
|
||||||
*/
|
*/
|
||||||
@@ -153,6 +163,46 @@ public final class PluginProps {
|
|||||||
this.supportingExtensions = supportingExtensions;
|
this.supportingExtensions = supportingExtensions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an environment variable.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @return The value of the variable.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public String getEnvironmentVariable(@NotNull final String name) {
|
||||||
|
return environment.get(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set an environment variable.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @param value The value.
|
||||||
|
*/
|
||||||
|
public void setEnvironmentVariable(@NotNull final String name,
|
||||||
|
@NotNull final String value) {
|
||||||
|
environment.put(name, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the plugin uses reflective reload.
|
||||||
|
*
|
||||||
|
* @return If the plugin uses reflective reload.
|
||||||
|
*/
|
||||||
|
public boolean isUsingReflectiveReload() {
|
||||||
|
return usesReflectiveReload;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set if the plugin uses reflective reload.
|
||||||
|
*
|
||||||
|
* @param usesReflectiveReload If the plugin uses reflective reload.
|
||||||
|
*/
|
||||||
|
public void setUsesReflectiveReload(final boolean usesReflectiveReload) {
|
||||||
|
this.usesReflectiveReload = usesReflectiveReload;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Ensure that all required props have been set.
|
* Ensure that all required props have been set.
|
||||||
*/
|
*/
|
||||||
@@ -221,7 +271,7 @@ public final class PluginProps {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Create new props from known values.
|
* Create new props from known values.
|
||||||
*
|
* <p>
|
||||||
* Marked as internal as this method will break whenever the properties themselves
|
* Marked as internal as this method will break whenever the properties themselves
|
||||||
* are updated (e.g. if a new property is added) - so to prevent any potential
|
* are updated (e.g. if a new property is added) - so to prevent any potential
|
||||||
* backwards-compatibility bugs, this method cannot be invoked outside eco itself.
|
* backwards-compatibility bugs, this method cannot be invoked outside eco itself.
|
||||||
@@ -232,7 +282,9 @@ public final class PluginProps {
|
|||||||
* @param color The primary color of the plugin.
|
* @param color The primary color of the plugin.
|
||||||
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
||||||
* @return The props.
|
* @return The props.
|
||||||
|
* @deprecated Moving to force the usage of eco.yml.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0")
|
||||||
static PluginProps createSimple(final int resourceId,
|
static PluginProps createSimple(final int resourceId,
|
||||||
final int bStatsId,
|
final int bStatsId,
|
||||||
@NotNull final String proxyPackage,
|
@NotNull final String proxyPackage,
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.willfp.eco.core;
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
import com.willfp.eco.core.integrations.economy.EconomyManager;
|
|
||||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||||
import com.willfp.eco.util.ClassUtils;
|
import com.willfp.eco.util.ClassUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -31,14 +30,11 @@ public class Prerequisite {
|
|||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to have vault installed.
|
* Requires the server to be running an implementation of paper.
|
||||||
*
|
|
||||||
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
|
|
||||||
*/
|
*/
|
||||||
@Deprecated(forRemoval = true)
|
public static final Prerequisite HAS_PROTOCOLLIB = new Prerequisite(
|
||||||
public static final Prerequisite HAS_VAULT = new Prerequisite(
|
() -> ClassUtils.exists("com.comphenix.protocol.events.PacketAdapter"),
|
||||||
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
|
"Requires server to have ProtocolLib"
|
||||||
"Requires server to have vault"
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,20 +53,12 @@ public class Prerequisite {
|
|||||||
"Requires server to be running 1.18+"
|
"Requires server to be running 1.18+"
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Requires the server to be running 1.17.
|
|
||||||
*
|
|
||||||
* @deprecated eco no longer supports versions before 1.17.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.25.2", forRemoval = true)
|
|
||||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
|
||||||
() -> ProxyConstants.NMS_VERSION.contains("17") || HAS_1_18.isMet(),
|
|
||||||
"Requires server to be running 1.17+"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to be running an implementation of BungeeCord.
|
* Requires the server to be running an implementation of BungeeCord.
|
||||||
|
*
|
||||||
|
* @deprecated This will never return true.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.49.0", forRemoval = true)
|
||||||
public static final Prerequisite HAS_BUNGEECORD = new Prerequisite(
|
public static final Prerequisite HAS_BUNGEECORD = new Prerequisite(
|
||||||
() -> ClassUtils.exists("net.md_5.bungee.api.event.ServerConnectedEvent"),
|
() -> ClassUtils.exists("net.md_5.bungee.api.event.ServerConnectedEvent"),
|
||||||
"Requires server to be running BungeeCord (or a fork)"
|
"Requires server to be running BungeeCord (or a fork)"
|
||||||
@@ -78,7 +66,10 @@ public class Prerequisite {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to be running an implementation of Velocity.
|
* Requires the server to be running an implementation of Velocity.
|
||||||
|
*
|
||||||
|
* @deprecated This will never return true.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.49.0", forRemoval = true)
|
||||||
public static final Prerequisite HAS_VELOCITY = new Prerequisite(
|
public static final Prerequisite HAS_VELOCITY = new Prerequisite(
|
||||||
() -> ClassUtils.exists("com.velocitypowered.api.event.player.ServerConnectedEvent"),
|
() -> ClassUtils.exists("com.velocitypowered.api.event.player.ServerConnectedEvent"),
|
||||||
"Requires server to be running Velocity (or a fork)"
|
"Requires server to be running Velocity (or a fork)"
|
||||||
|
|||||||
@@ -1,32 +1,37 @@
|
|||||||
package com.willfp.eco.core.command;
|
package com.willfp.eco.core.command;
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
import org.bukkit.command.CommandSender;
|
import org.bukkit.command.CommandSender;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Objects;
|
||||||
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for all command implementations.
|
* Generic interface for commands.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("removal")
|
@SuppressWarnings("null")
|
||||||
public interface CommandBase {
|
public interface CommandBase {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get command name.
|
* Get command name.
|
||||||
*
|
*
|
||||||
* @return The name.
|
* @return The name.
|
||||||
*/
|
*/
|
||||||
String getName();
|
@NotNull String getName();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get command permission.
|
* Get command permission.
|
||||||
*
|
*
|
||||||
* @return The permission.
|
* @return The permission.
|
||||||
*/
|
*/
|
||||||
String getPermission();
|
@NotNull String getPermission();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If only players can execute the command.
|
* If only players can execute the command.
|
||||||
@@ -41,110 +46,237 @@ public interface CommandBase {
|
|||||||
* @param command The subcommand.
|
* @param command The subcommand.
|
||||||
* @return The parent command.
|
* @return The parent command.
|
||||||
*/
|
*/
|
||||||
CommandBase addSubcommand(@NotNull CommandBase command);
|
@NotNull CommandBase addSubcommand(@NotNull CommandBase command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the subcommands of the command.
|
||||||
|
*
|
||||||
|
* @return The subcommands.
|
||||||
|
*/
|
||||||
|
@NotNull List<CommandBase> getSubcommands();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intended for returning the enclosing CommandBase,
|
||||||
|
* when this instance is serving as the delegate command base.
|
||||||
|
*
|
||||||
|
* @return the wrapping object of this delegate.
|
||||||
|
*/
|
||||||
|
default @NotNull CommandBase getWrapped() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle command execution.
|
* Handle command execution.
|
||||||
|
* <p>
|
||||||
|
* This will always be called on command execution.
|
||||||
*
|
*
|
||||||
* @param sender The sender.
|
* @param sender The sender.
|
||||||
* @param args The args.
|
* @param args The args.
|
||||||
|
* @throws NotificationException naturally, this is handled as a part of the command system.
|
||||||
*/
|
*/
|
||||||
default void onExecute(@NotNull CommandSender sender,
|
default void onExecute(@NotNull final CommandSender sender, @NotNull final List<String> args) throws NotificationException {
|
||||||
@NotNull List<String> args) {
|
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle command execution from players.
|
* Handle command execution from players.
|
||||||
|
* <p>
|
||||||
|
* This will only be called if the sender is a player.
|
||||||
*
|
*
|
||||||
* @param sender The sender.
|
* @param sender The sender.
|
||||||
* @param args The args.
|
* @param args The args.
|
||||||
|
* @throws NotificationException naturally, this is handled as a part of the command system.
|
||||||
*/
|
*/
|
||||||
default void onExecute(@NotNull Player sender,
|
default void onExecute(@NotNull final Player sender, @NotNull final List<String> args) throws NotificationException {
|
||||||
@NotNull List<String> args) {
|
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle tab completion.
|
* Handle tab completion.
|
||||||
|
* <p>
|
||||||
|
* This will always be called on tab completion.
|
||||||
*
|
*
|
||||||
* @param sender The sender.
|
* @param sender The sender.
|
||||||
* @param args The args.
|
* @param args The args.
|
||||||
* @return The results.
|
* @return The results.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default List<String> tabComplete(@NotNull CommandSender sender,
|
default List<String> tabComplete(@NotNull final CommandSender sender, @NotNull final List<String> args) {
|
||||||
@NotNull List<String> args) {
|
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handle tab completion.
|
* Handle tab completion.
|
||||||
|
* <p>
|
||||||
|
* This will only be called if the sender is a player.
|
||||||
*
|
*
|
||||||
* @param sender The sender.
|
* @param sender The sender.
|
||||||
* @param args The args.
|
* @param args The args.
|
||||||
* @return The results.
|
* @return The results.
|
||||||
*/
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
default List<String> tabComplete(@NotNull Player sender,
|
default List<String> tabComplete(@NotNull final Player sender, @NotNull final List<String> args) {
|
||||||
@NotNull List<String> args) {
|
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @throws NotificationException always.
|
||||||
|
*/
|
||||||
|
default void notify(@NotNull final String key) throws NotificationException {
|
||||||
|
throw new NotificationException(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key
|
||||||
|
* if the passed object is null.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param obj The object to test.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @param <T> The object type.
|
||||||
|
* @return Returns the object, definitely not-null.
|
||||||
|
* @throws NotificationException If the object is null.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default <T> T notifyNull(@Nullable final T obj,
|
||||||
|
@NotNull final String key) throws NotificationException {
|
||||||
|
if (Objects.isNull(obj)) {
|
||||||
|
notify(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return Objects.requireNonNull(obj);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key
|
||||||
|
* if the passed object doesn't match the predicate.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param obj The object to test.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @param predicate The predicate to test the object against.
|
||||||
|
* @param <T> The type of the object.
|
||||||
|
* @return Returns the object, definitely not-null.
|
||||||
|
* @throws NotificationException If the object doesn't satisfy the predicate.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default <T> T notifyFalse(@NotNull final T obj,
|
||||||
|
@NotNull final String key,
|
||||||
|
@NotNull final Predicate<T> predicate) throws NotificationException {
|
||||||
|
notifyFalse(predicate.test(obj), key);
|
||||||
|
|
||||||
|
return obj;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key
|
||||||
|
* if a condition is false.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param condition The condition to test.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @return True.
|
||||||
|
* @throws NotificationException If the condition is false.
|
||||||
|
*/
|
||||||
|
default boolean notifyFalse(final boolean condition,
|
||||||
|
@NotNull final String key) throws NotificationException {
|
||||||
|
if (!condition) {
|
||||||
|
notify(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key
|
||||||
|
* if the passed string doesn't relate to a currently online player.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param playerName The player name.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @return Returns the player, definitely not-null.
|
||||||
|
* @throws NotificationException If the player name is invalid.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default Player notifyPlayerRequired(@Nullable final String playerName, @NotNull final String key) throws NotificationException {
|
||||||
|
if (playerName == null) {
|
||||||
|
notify(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert playerName != null;
|
||||||
|
|
||||||
|
final Player player = Bukkit.getPlayer(playerName);
|
||||||
|
|
||||||
|
notifyNull(player, key);
|
||||||
|
|
||||||
|
return Objects.requireNonNull(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an {@link NotificationException} relating to a specific lang.yml key
|
||||||
|
* if the passed string doesn't relate to a player on the server.
|
||||||
|
* <p>
|
||||||
|
* This is automatically handled with eco, and should not be surrounded by a
|
||||||
|
* try/catch block.
|
||||||
|
*
|
||||||
|
* @param playerName The player name.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @return Returns the offline player, definitely not-null.
|
||||||
|
* @throws NotificationException If the player name is invalid.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default OfflinePlayer notifyOfflinePlayerRequired(@Nullable final String playerName,
|
||||||
|
@NotNull final String key) throws NotificationException {
|
||||||
|
if (playerName == null) {
|
||||||
|
notify(key);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert playerName != null;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation") final OfflinePlayer player = Bukkit.getOfflinePlayer(playerName);
|
||||||
|
|
||||||
|
boolean hasPlayedBefore = player.hasPlayedBefore() || player.isOnline();
|
||||||
|
|
||||||
|
notifyFalse(!hasPlayedBefore, key);
|
||||||
|
|
||||||
|
return player;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Throws an exception containing a langYml key if player doesn't have permission.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @param permission The permission.
|
||||||
|
* @param key The lang.yml key for the message to be sent.
|
||||||
|
* @return The player.
|
||||||
|
* @throws NotificationException If the player doesn't have the required permission.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default Player notifyPermissionRequired(@NotNull final Player player,
|
||||||
|
@NotNull final String permission,
|
||||||
|
@NotNull final String key) throws NotificationException {
|
||||||
|
return notifyFalse(player, key, p -> p.hasPermission(permission));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the plugin.
|
* Get the plugin.
|
||||||
*
|
*
|
||||||
* @return The plugin.
|
* @return The plugin.
|
||||||
*/
|
*/
|
||||||
EcoPlugin getPlugin();
|
EcoPlugin getPlugin();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the handler.
|
|
||||||
*
|
|
||||||
* @return The handler.
|
|
||||||
* @see CommandHandler
|
|
||||||
* @deprecated Use {@link CommandBase#onExecute(CommandSender, List)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
default CommandHandler getHandler() {
|
|
||||||
return (a, b) -> {
|
|
||||||
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the handler.
|
|
||||||
*
|
|
||||||
* @param handler The handler.
|
|
||||||
* @see CommandHandler
|
|
||||||
* @deprecated Handlers have been deprecated.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
default void setHandler(@NotNull final CommandHandler handler) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the tab completer.
|
|
||||||
*
|
|
||||||
* @return The tab completer.
|
|
||||||
* @see TabCompleteHandler
|
|
||||||
* @deprecated Use {@link CommandBase#tabComplete(CommandSender, List)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
default TabCompleteHandler getTabCompleter() {
|
|
||||||
return (a, b) -> ImmutableList.of();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Set the tab completer.
|
|
||||||
*
|
|
||||||
* @param handler The handler.
|
|
||||||
* @see TabCompleteHandler
|
|
||||||
* @deprecated Handlers have been deprecated.
|
|
||||||
*/
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
default void setTabCompleter(@NotNull final TabCompleteHandler handler) {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,29 +0,0 @@
|
|||||||
package com.willfp.eco.core.command;
|
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A command handler handles the actual code for a command.
|
|
||||||
* <p>
|
|
||||||
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
|
|
||||||
*
|
|
||||||
* @see CommandBase
|
|
||||||
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
|
|
||||||
* update to use the new system: {@link CommandBase#onExecute(CommandSender, List)}.
|
|
||||||
*/
|
|
||||||
@FunctionalInterface
|
|
||||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
|
||||||
public interface CommandHandler {
|
|
||||||
/**
|
|
||||||
* The code to be called on execution.
|
|
||||||
*
|
|
||||||
* @param sender The sender.
|
|
||||||
* @param args The arguments.
|
|
||||||
*/
|
|
||||||
void onExecute(@NotNull CommandSender sender,
|
|
||||||
@NotNull List<String> args);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
package com.willfp.eco.core.command;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A notification exception is thrown when {@link org.bukkit.command.CommandSender}s don't
|
||||||
|
* specify valid arguments in commands.
|
||||||
|
* <p>
|
||||||
|
* Methods in eco that throw this will contain automatic handling and thus
|
||||||
|
* should not be surrounded by try / catch blocks.
|
||||||
|
*/
|
||||||
|
public class NotificationException extends Exception {
|
||||||
|
/**
|
||||||
|
* The key for the lang.yml message to be sent.
|
||||||
|
*/
|
||||||
|
private final String key;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a notification exception.
|
||||||
|
*
|
||||||
|
* @param key The lang key of the notification.
|
||||||
|
*/
|
||||||
|
public NotificationException(@NotNull final String key) {
|
||||||
|
super(key);
|
||||||
|
this.key = key;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the lang key.
|
||||||
|
*
|
||||||
|
* @return The lang key.
|
||||||
|
*/
|
||||||
|
public String getKey() {
|
||||||
|
return key;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
package com.willfp.eco.core.command;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin command bases can be registered directly with the server,
|
||||||
|
* this essentially functions as the interface that is implemented generically
|
||||||
|
* via {@link com.willfp.eco.core.command.impl.PluginCommand}.
|
||||||
|
*/
|
||||||
|
public interface PluginCommandBase extends CommandBase {
|
||||||
|
/**
|
||||||
|
* Register the PluginCommandBase to the bukkit commandMap.
|
||||||
|
*/
|
||||||
|
void register();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unregister the PluginCommandBase from the bukkit commandMap.
|
||||||
|
*/
|
||||||
|
void unregister();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get aliases. Leave null if this command is from plugin.yml.
|
||||||
|
*
|
||||||
|
* @return The aliases.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default List<String> getAliases() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get description.
|
||||||
|
*
|
||||||
|
* @return The description.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
default String getDescription() {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
package com.willfp.eco.core.command;
|
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A Tab Complete handler handles the actual tab-completion code.
|
|
||||||
* <p>
|
|
||||||
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
|
|
||||||
*
|
|
||||||
* @see CommandBase
|
|
||||||
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
|
|
||||||
* update to use the new system: {@link CommandBase#tabComplete(CommandSender, List)}
|
|
||||||
*/
|
|
||||||
@FunctionalInterface
|
|
||||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
|
||||||
public interface TabCompleteHandler {
|
|
||||||
/**
|
|
||||||
* Handle Tab Completion.
|
|
||||||
*
|
|
||||||
* @param sender The sender.
|
|
||||||
* @param args The arguments.
|
|
||||||
* @return The tab completion results.
|
|
||||||
*/
|
|
||||||
List<String> tabComplete(@NotNull CommandSender sender,
|
|
||||||
@NotNull List<String> args);
|
|
||||||
}
|
|
||||||
@@ -6,13 +6,15 @@ import org.bukkit.command.PluginIdentifiableCommand;
|
|||||||
import org.bukkit.command.TabCompleter;
|
import org.bukkit.command.TabCompleter;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Delegates a bukkit command to an eco command (for registrations).
|
* Delegates a bukkit command to an eco command (for registrations).
|
||||||
|
*
|
||||||
|
* @deprecated Internal command implementations have been removed from the API.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.49.0", forRemoval = true)
|
||||||
public final class DelegatedBukkitCommand extends Command implements TabCompleter, PluginIdentifiableCommand {
|
public final class DelegatedBukkitCommand extends Command implements TabCompleter, PluginIdentifiableCommand {
|
||||||
/**
|
/**
|
||||||
* The delegate command.
|
* The delegate command.
|
||||||
@@ -34,7 +36,7 @@ public final class DelegatedBukkitCommand extends Command implements TabComplete
|
|||||||
public boolean execute(@NotNull final CommandSender commandSender,
|
public boolean execute(@NotNull final CommandSender commandSender,
|
||||||
@NotNull final String label,
|
@NotNull final String label,
|
||||||
@NotNull final String[] args) {
|
@NotNull final String[] args) {
|
||||||
return delegate.onCommand(commandSender, this, label, args);
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -42,7 +44,7 @@ public final class DelegatedBukkitCommand extends Command implements TabComplete
|
|||||||
@NotNull final Command command,
|
@NotNull final Command command,
|
||||||
@NotNull final String label,
|
@NotNull final String label,
|
||||||
@NotNull final String[] args) {
|
@NotNull final String[] args) {
|
||||||
return delegate.onTabComplete(commandSender, command, label, args);
|
return List.of();
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -51,9 +53,8 @@ public final class DelegatedBukkitCommand extends Command implements TabComplete
|
|||||||
return this.delegate.getPlugin();
|
return this.delegate.getPlugin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
@Override
|
||||||
public String getPermission() {
|
public @NotNull String getPermission() {
|
||||||
return this.delegate.getPermission();
|
return this.delegate.getPermission();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,294 +0,0 @@
|
|||||||
package com.willfp.eco.core.command.impl;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import com.willfp.eco.core.command.CommandBase;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.bukkit.util.StringUtil;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Abstract class for commands that can be handled.
|
|
||||||
* <p>
|
|
||||||
* Handled commands have a method to pass in raw input from bukkit commands
|
|
||||||
* in order to execute the command-specific code. It's essentially an internal
|
|
||||||
* layer, hence why it's a package-private class.
|
|
||||||
*/
|
|
||||||
@SuppressWarnings({"DeprecatedIsStillUsed", "removal"})
|
|
||||||
abstract class HandledCommand implements CommandBase {
|
|
||||||
/**
|
|
||||||
* The plugin.
|
|
||||||
*/
|
|
||||||
private final EcoPlugin plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the command.
|
|
||||||
*/
|
|
||||||
private final String name;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The permission required to execute the command.
|
|
||||||
* <p>
|
|
||||||
* Written out as a string for flexibility with subclasses.
|
|
||||||
*/
|
|
||||||
private final String permission;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Should the command only be allowed to be executed by players?
|
|
||||||
* <p>
|
|
||||||
* In other worlds, only allowed to be executed by console.
|
|
||||||
*/
|
|
||||||
private final boolean playersOnly;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The actual code to be executed in the command.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Nullable
|
|
||||||
private com.willfp.eco.core.command.CommandHandler handler = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The tab completion code to be executed in the command.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
@Nullable
|
|
||||||
private com.willfp.eco.core.command.TabCompleteHandler tabCompleter = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All subcommands for the command.
|
|
||||||
*/
|
|
||||||
private final List<CommandBase> subcommands;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command.
|
|
||||||
* <p>
|
|
||||||
* The name cannot be the same as an existing command as this will conflict.
|
|
||||||
*
|
|
||||||
* @param plugin Instance of a plugin.
|
|
||||||
* @param name The name used in execution.
|
|
||||||
* @param permission The permission required to execute the command.
|
|
||||||
* @param playersOnly If only players should be able to execute this command.
|
|
||||||
*/
|
|
||||||
HandledCommand(@NotNull final EcoPlugin plugin,
|
|
||||||
@NotNull final String name,
|
|
||||||
@NotNull final String permission,
|
|
||||||
final boolean playersOnly) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
this.name = name;
|
|
||||||
this.permission = permission;
|
|
||||||
this.playersOnly = playersOnly;
|
|
||||||
this.subcommands = new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Add a subcommand to the command.
|
|
||||||
*
|
|
||||||
* @param subcommand The subcommand.
|
|
||||||
* @return The parent command.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public final CommandBase addSubcommand(@NotNull final CommandBase subcommand) {
|
|
||||||
subcommands.add(subcommand);
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the plugin.
|
|
||||||
*
|
|
||||||
* @return The plugin.
|
|
||||||
*/
|
|
||||||
@Override
|
|
||||||
public EcoPlugin getPlugin() {
|
|
||||||
return this.plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the command.
|
|
||||||
*
|
|
||||||
* @param sender The sender.
|
|
||||||
* @param args The arguments.
|
|
||||||
*/
|
|
||||||
protected final void handle(@NotNull final CommandSender sender,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
if (!canExecute(sender, this, this.getPlugin())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length > 0) {
|
|
||||||
for (CommandBase subcommand : this.getSubcommands()) {
|
|
||||||
if (subcommand.getName().equalsIgnoreCase(args[0])) {
|
|
||||||
if (!canExecute(sender, subcommand, this.getPlugin())) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
((HandledCommand) subcommand).handle(sender, Arrays.copyOfRange(args, 1, args.length));
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.isPlayersOnly() && !(sender instanceof Player)) {
|
|
||||||
sender.sendMessage(this.getPlugin().getLangYml().getMessage("not-player"));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getHandler() != null) {
|
|
||||||
this.getHandler().onExecute(sender, Arrays.asList(args));
|
|
||||||
} else {
|
|
||||||
this.onExecute(sender, Arrays.asList(args));
|
|
||||||
if (sender instanceof Player player) {
|
|
||||||
this.onExecute(player, Arrays.asList(args));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Handle the tab completion.
|
|
||||||
*
|
|
||||||
* @param sender The sender.
|
|
||||||
* @param args The arguments.
|
|
||||||
* @return The tab completion results.
|
|
||||||
*/
|
|
||||||
protected final List<String> handleTabCompletion(@NotNull final CommandSender sender,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
|
|
||||||
if (!sender.hasPermission(this.getPermission())) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length == 1) {
|
|
||||||
List<String> completions = new ArrayList<>();
|
|
||||||
|
|
||||||
StringUtil.copyPartialMatches(
|
|
||||||
args[0],
|
|
||||||
this.getSubcommands().stream()
|
|
||||||
.filter(subCommand -> sender.hasPermission(subCommand.getPermission()))
|
|
||||||
.map(CommandBase::getName)
|
|
||||||
.collect(Collectors.toList()),
|
|
||||||
completions
|
|
||||||
);
|
|
||||||
|
|
||||||
Collections.sort(completions);
|
|
||||||
|
|
||||||
if (!completions.isEmpty()) {
|
|
||||||
return completions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args.length >= 2) {
|
|
||||||
HandledCommand command = null;
|
|
||||||
|
|
||||||
for (CommandBase subcommand : this.getSubcommands()) {
|
|
||||||
if (!sender.hasPermission(subcommand.getPermission())) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (args[0].equalsIgnoreCase(subcommand.getName())) {
|
|
||||||
command = (HandledCommand) subcommand;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (command != null) {
|
|
||||||
return command.handleTabCompletion(sender, Arrays.copyOfRange(args, 1, args.length));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (this.getTabCompleter() != null) {
|
|
||||||
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
|
|
||||||
} else {
|
|
||||||
List<String> completions = new ArrayList<>(this.tabComplete(sender, Arrays.asList(args)));
|
|
||||||
if (sender instanceof Player player) {
|
|
||||||
completions.addAll(this.tabComplete(player, Arrays.asList(args)));
|
|
||||||
}
|
|
||||||
return completions;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If a sender can execute the command.
|
|
||||||
*
|
|
||||||
* @param sender The sender.
|
|
||||||
* @param command The command.
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @return If the sender can execute.
|
|
||||||
*/
|
|
||||||
public static boolean canExecute(@NotNull final CommandSender sender,
|
|
||||||
@NotNull final CommandBase command,
|
|
||||||
@NotNull final EcoPlugin plugin) {
|
|
||||||
if (!sender.hasPermission(command.getPermission()) && sender instanceof Player) {
|
|
||||||
sender.sendMessage(plugin.getLangYml().getNoPermission());
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the command name.
|
|
||||||
*
|
|
||||||
* @return The name.
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the permission required to execute the command.
|
|
||||||
*
|
|
||||||
* @return The permission.
|
|
||||||
*/
|
|
||||||
public String getPermission() {
|
|
||||||
return this.permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get if the command can only be executed by players.
|
|
||||||
*
|
|
||||||
* @return If players only.
|
|
||||||
*/
|
|
||||||
public boolean isPlayersOnly() {
|
|
||||||
return this.playersOnly;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the subcommands of the command.
|
|
||||||
*
|
|
||||||
* @return The subcommands.
|
|
||||||
*/
|
|
||||||
public List<CommandBase> getSubcommands() {
|
|
||||||
return this.subcommands;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
@Override
|
|
||||||
public @Nullable com.willfp.eco.core.command.CommandHandler getHandler() {
|
|
||||||
return this.handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
@Override
|
|
||||||
public @Nullable com.willfp.eco.core.command.TabCompleteHandler getTabCompleter() {
|
|
||||||
return this.tabCompleter;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
@Override
|
|
||||||
public void setHandler(@Nullable final com.willfp.eco.core.command.CommandHandler handler) {
|
|
||||||
this.handler = handler;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Deprecated(forRemoval = true)
|
|
||||||
@Override
|
|
||||||
public void setTabCompleter(@Nullable final com.willfp.eco.core.command.TabCompleteHandler tabCompleter) {
|
|
||||||
this.tabCompleter = tabCompleter;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -2,29 +2,27 @@ package com.willfp.eco.core.command.impl;
|
|||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import org.bukkit.Bukkit;
|
import com.willfp.eco.core.command.CommandBase;
|
||||||
import org.bukkit.command.Command;
|
import com.willfp.eco.core.command.PluginCommandBase;
|
||||||
import org.bukkit.command.CommandExecutor;
|
|
||||||
import org.bukkit.command.CommandMap;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.command.TabCompleter;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PluginCommands are the class to be used instead of CommandExecutor,
|
* PluginCommands are the class to be used instead of CommandExecutor, they function as the base
|
||||||
* they function as the base command, e.g. {@code /ecoenchants} would be a base command, with each
|
* command, e.g. {@code /ecoenchants} would be a base command, with each subsequent argument
|
||||||
* subsequent argument functioning as subcommands.
|
* functioning as subcommands.
|
||||||
* <p>
|
* <p>
|
||||||
* The command will not be registered until register() is called.
|
* The command will not be registered until register() is called.
|
||||||
* <p>
|
* <p>
|
||||||
* The name cannot be the same as an existing command as this will conflict.
|
* The name cannot be the same as an existing command as this will conflict.
|
||||||
*/
|
*/
|
||||||
public abstract class PluginCommand extends HandledCommand implements CommandExecutor, TabCompleter {
|
public abstract class PluginCommand implements PluginCommandBase {
|
||||||
|
/**
|
||||||
|
* The delegate command.
|
||||||
|
*/
|
||||||
|
private final PluginCommandBase delegate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new command.
|
* Create a new command.
|
||||||
*
|
*
|
||||||
@@ -37,128 +35,51 @@ public abstract class PluginCommand extends HandledCommand implements CommandExe
|
|||||||
@NotNull final String name,
|
@NotNull final String name,
|
||||||
@NotNull final String permission,
|
@NotNull final String permission,
|
||||||
final boolean playersOnly) {
|
final boolean playersOnly) {
|
||||||
super(plugin, name, permission, playersOnly);
|
this.delegate = Eco.get().createPluginCommand(this, plugin, name, permission, playersOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers the command with the server,
|
|
||||||
*/
|
|
||||||
public final void register() {
|
|
||||||
org.bukkit.command.PluginCommand command = Bukkit.getPluginCommand(this.getName());
|
|
||||||
if (command != null) {
|
|
||||||
command.setExecutor(this);
|
|
||||||
command.setTabCompleter(this);
|
|
||||||
|
|
||||||
if (this.getDescription() != null) {
|
|
||||||
command.setDescription(this.getDescription());
|
|
||||||
}
|
|
||||||
|
|
||||||
List<String> aliases = new ArrayList<>(command.getAliases());
|
|
||||||
aliases.addAll(this.getAliases());
|
|
||||||
command.setAliases(aliases);
|
|
||||||
} else {
|
|
||||||
this.unregister();
|
|
||||||
|
|
||||||
CommandMap commandMap = getCommandMap();
|
|
||||||
|
|
||||||
commandMap.register(this.getPlugin().getName().toLowerCase(), new DelegatedBukkitCommand(this));
|
|
||||||
}
|
|
||||||
|
|
||||||
Eco.get().syncCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Unregisters the command from the server.
|
|
||||||
*/
|
|
||||||
public final void unregister() {
|
|
||||||
CommandMap commandMap = getCommandMap();
|
|
||||||
|
|
||||||
Command found = commandMap.getCommand(this.getName());
|
|
||||||
if (found != null) {
|
|
||||||
found.unregister(commandMap);
|
|
||||||
}
|
|
||||||
|
|
||||||
Eco.get().syncCommands();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get aliases. Leave null if this command is from plugin.yml.
|
|
||||||
*
|
|
||||||
* @return The aliases.
|
|
||||||
*/
|
|
||||||
@NotNull
|
|
||||||
public List<String> getAliases() {
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get description.
|
|
||||||
*
|
|
||||||
* @return The description.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public String getDescription() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal implementation used to clean up boilerplate.
|
|
||||||
* Used for parity with {@link CommandExecutor#onCommand(CommandSender, Command, String, String[])}.
|
|
||||||
*
|
|
||||||
* @param sender The executor of the command.
|
|
||||||
* @param command The bukkit command.
|
|
||||||
* @param label The name of the executed command.
|
|
||||||
* @param args The arguments of the command (anything after the physical command name)
|
|
||||||
* @return If the command was processed by the linked {@link EcoPlugin}
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public final boolean onCommand(@NotNull final CommandSender sender,
|
public @NotNull String getName() {
|
||||||
@NotNull final Command command,
|
return delegate.getName();
|
||||||
@NotNull final String label,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
if (!command.getName().equalsIgnoreCase(this.getName())) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.handle(sender, args);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal implementation used to clean up boilerplate.
|
|
||||||
* Used for parity with {@link TabCompleter#onTabComplete(CommandSender, Command, String, String[])}.
|
|
||||||
*
|
|
||||||
* @param sender The executor of the command.
|
|
||||||
* @param command The bukkit command.
|
|
||||||
* @param label The name of the executed command.
|
|
||||||
* @param args The arguments of the command (anything after the physical command name).
|
|
||||||
* @return The list of tab-completions.
|
|
||||||
*/
|
|
||||||
@Override
|
@Override
|
||||||
public @Nullable List<String> onTabComplete(@NotNull final CommandSender sender,
|
public @NotNull String getPermission() {
|
||||||
@NotNull final Command command,
|
return delegate.getPermission();
|
||||||
@NotNull final String label,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
if (!command.getName().equalsIgnoreCase(this.getName())) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return this.handleTabCompletion(sender, args);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
@Override
|
||||||
* Get the internal server CommandMap.
|
public boolean isPlayersOnly() {
|
||||||
*
|
return delegate.isPlayersOnly();
|
||||||
* @return The CommandMap.
|
}
|
||||||
*/
|
|
||||||
public static CommandMap getCommandMap() {
|
@Override
|
||||||
try {
|
public @NotNull CommandBase addSubcommand(@NotNull CommandBase command) {
|
||||||
Field field = Bukkit.getServer().getClass().getDeclaredField("commandMap");
|
return delegate.addSubcommand(command);
|
||||||
field.setAccessible(true);
|
}
|
||||||
return (CommandMap) field.get(Bukkit.getServer());
|
|
||||||
} catch (NoSuchFieldException | IllegalAccessException e) {
|
@Override
|
||||||
throw new NullPointerException("Command map wasn't found!");
|
public @NotNull List<CommandBase> getSubcommands() {
|
||||||
}
|
return delegate.getSubcommands();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull CommandBase getWrapped() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void register() {
|
||||||
|
delegate.register();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void unregister() {
|
||||||
|
delegate.unregister();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EcoPlugin getPlugin() {
|
||||||
|
return delegate.getPlugin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,21 @@
|
|||||||
package com.willfp.eco.core.command.impl;
|
package com.willfp.eco.core.command.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.command.CommandBase;
|
import com.willfp.eco.core.command.CommandBase;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Subcommands can be added to PluginCommands or to other Subcommands.
|
* A command implementation that must exist as a subcommand (i.e. cannot be registered directly).
|
||||||
*/
|
*/
|
||||||
public abstract class Subcommand extends HandledCommand {
|
public abstract class Subcommand implements CommandBase {
|
||||||
|
/**
|
||||||
|
* The delegate command.
|
||||||
|
*/
|
||||||
|
private final CommandBase delegate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create subcommand.
|
* Create subcommand.
|
||||||
*
|
*
|
||||||
@@ -20,7 +28,7 @@ public abstract class Subcommand extends HandledCommand {
|
|||||||
@NotNull final String name,
|
@NotNull final String name,
|
||||||
@NotNull final String permission,
|
@NotNull final String permission,
|
||||||
final boolean playersOnly) {
|
final boolean playersOnly) {
|
||||||
super(plugin, name, permission, playersOnly);
|
this.delegate = Eco.get().createSubcommand(this, plugin, name, permission, playersOnly);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -33,6 +41,41 @@ public abstract class Subcommand extends HandledCommand {
|
|||||||
protected Subcommand(@NotNull final EcoPlugin plugin,
|
protected Subcommand(@NotNull final EcoPlugin plugin,
|
||||||
@NotNull final String name,
|
@NotNull final String name,
|
||||||
@NotNull final CommandBase parent) {
|
@NotNull final CommandBase parent) {
|
||||||
super(plugin, name, parent.getPermission(), parent.isPlayersOnly());
|
this(plugin, name, parent.getPermission(), parent.isPlayersOnly());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getName() {
|
||||||
|
return delegate.getName();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getPermission() {
|
||||||
|
return delegate.getPermission();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isPlayersOnly() {
|
||||||
|
return delegate.isPlayersOnly();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull CommandBase addSubcommand(@NotNull CommandBase command) {
|
||||||
|
return delegate.addSubcommand(command);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<CommandBase> getSubcommands() {
|
||||||
|
return delegate.getSubcommands();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull CommandBase getWrapped() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public EcoPlugin getPlugin() {
|
||||||
|
return delegate.getPlugin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
*/
|
*/
|
||||||
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
||||||
/**
|
/**
|
||||||
|
* Create a new extendable config.
|
||||||
|
*
|
||||||
* @param configName The name of the config
|
* @param configName The name of the config
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
* @param plugin The plugin.
|
* @param plugin The plugin.
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ import java.util.Map;
|
|||||||
@Deprecated(since = "6.44.0", forRemoval = true)
|
@Deprecated(since = "6.44.0", forRemoval = true)
|
||||||
public class TransientConfig extends ConfigWrapper<Config> {
|
public class TransientConfig extends ConfigWrapper<Config> {
|
||||||
/**
|
/**
|
||||||
|
* Create new transient config from bukkit config.
|
||||||
|
*
|
||||||
* @param config The ConfigurationSection handle.
|
* @param config The ConfigurationSection handle.
|
||||||
*/
|
*/
|
||||||
public TransientConfig(@NotNull final ConfigurationSection config) {
|
public TransientConfig(@NotNull final ConfigurationSection config) {
|
||||||
@@ -42,6 +44,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Create a transient config from an input stream.
|
||||||
|
*
|
||||||
* @param stream The InputStream.
|
* @param stream The InputStream.
|
||||||
*/
|
*/
|
||||||
public TransientConfig(@Nullable final InputStream stream) {
|
public TransientConfig(@Nullable final InputStream stream) {
|
||||||
@@ -51,15 +55,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param file The File.
|
* Load a file to a config.
|
||||||
* @deprecated Specify the config type to prevent bugs.
|
*
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
|
||||||
public TransientConfig(@Nullable final File file) {
|
|
||||||
this(file, ConfigType.YAML);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param file The file.
|
* @param file The file.
|
||||||
* @param type The config type to try read from.
|
* @param type The config type to try read from.
|
||||||
*/
|
*/
|
||||||
@@ -97,6 +94,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* Load a config from a string.
|
||||||
|
*
|
||||||
* @param contents The contents of the config.
|
* @param contents The contents of the config.
|
||||||
* @param type The config type.
|
* @param type The config type.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -6,10 +6,32 @@ import com.willfp.eco.core.config.ConfigType;
|
|||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default plugin lang.yml.
|
* Default plugin lang.yml.
|
||||||
*/
|
*/
|
||||||
public class LangYml extends BaseConfig {
|
public class LangYml extends BaseConfig {
|
||||||
|
/**
|
||||||
|
* The messages key.
|
||||||
|
*/
|
||||||
|
public static final String KEY_MESSAGES = "messages";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The prefix key.
|
||||||
|
*/
|
||||||
|
public static final String KEY_PREFIX = "messages.prefix";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The no permission key.
|
||||||
|
*/
|
||||||
|
public static final String KEY_NO_PERMISSION = "messages.no-permission";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The not player key.
|
||||||
|
*/
|
||||||
|
public static final String KEY_NOT_PLAYER = "messages.not-player";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Lang.yml.
|
* Lang.yml.
|
||||||
*
|
*
|
||||||
@@ -19,13 +41,31 @@ public class LangYml extends BaseConfig {
|
|||||||
super("lang", plugin, false, ConfigType.YAML);
|
super("lang", plugin, false, ConfigType.YAML);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* lang.yml requires certain keys to be present.
|
||||||
|
* <p>
|
||||||
|
* If the lang.yml does not contain these keys, it is considered to be
|
||||||
|
* invalid and thus will show a warning in console.
|
||||||
|
*
|
||||||
|
* @return If valid.
|
||||||
|
*/
|
||||||
|
public boolean isValid() {
|
||||||
|
for (String key : List.of(KEY_MESSAGES, KEY_PREFIX, KEY_NO_PERMISSION, KEY_NOT_PLAYER)) {
|
||||||
|
if (!this.has(key)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the prefix for messages in chat.
|
* Get the prefix for messages in chat.
|
||||||
*
|
*
|
||||||
* @return The prefix.
|
* @return The prefix.
|
||||||
*/
|
*/
|
||||||
public String getPrefix() {
|
public String getPrefix() {
|
||||||
return this.getFormattedString("messages.prefix");
|
return this.getFormattedString(KEY_PREFIX);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,7 +74,7 @@ public class LangYml extends BaseConfig {
|
|||||||
* @return The message.
|
* @return The message.
|
||||||
*/
|
*/
|
||||||
public String getNoPermission() {
|
public String getNoPermission() {
|
||||||
return getPrefix() + this.getFormattedString("messages.no-permission");
|
return getPrefix() + this.getFormattedString(KEY_NO_PERMISSION);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -56,6 +96,6 @@ public class LangYml extends BaseConfig {
|
|||||||
*/
|
*/
|
||||||
public String getMessage(@NotNull final String message,
|
public String getMessage(@NotNull final String message,
|
||||||
@NotNull final StringUtils.FormatOption option) {
|
@NotNull final StringUtils.FormatOption option) {
|
||||||
return getPrefix() + this.getFormattedString("messages." + message, option);
|
return getPrefix() + this.getFormattedString(KEY_MESSAGES + "." + message, option);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,16 +30,6 @@ import java.util.Set;
|
|||||||
*/
|
*/
|
||||||
@SuppressWarnings("unused")
|
@SuppressWarnings("unused")
|
||||||
public interface Config extends Cloneable, PlaceholderInjectable {
|
public interface Config extends Cloneable, PlaceholderInjectable {
|
||||||
/**
|
|
||||||
* Clears cache.
|
|
||||||
* <p>
|
|
||||||
* Configs no longer have caches as they have in previous versions.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
|
||||||
default void clearCache() {
|
|
||||||
// Do nothing.
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the config into readable text.
|
* Convert the config into readable text.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.config.interfaces;
|
|||||||
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -44,21 +43,6 @@ public interface LoadableConfig extends Config {
|
|||||||
*/
|
*/
|
||||||
String getName();
|
String getName();
|
||||||
|
|
||||||
/**
|
|
||||||
* Get bukkit {@link YamlConfiguration}.
|
|
||||||
* <p>
|
|
||||||
* This used to represent the underlying config, but since 6.30.0 configs use
|
|
||||||
* their own implementations internally, without relying on bukkit.
|
|
||||||
*
|
|
||||||
* @return The config, or null if config is not yaml-based.
|
|
||||||
* @deprecated Use toBukkit() instead.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
|
||||||
default YamlConfiguration getBukkitHandle() {
|
|
||||||
return this.toBukkit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Convert the config to a bukkit {@link YamlConfiguration}.
|
* Convert the config to a bukkit {@link YamlConfiguration}.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -38,6 +38,9 @@ import java.lang.annotation.Target;
|
|||||||
* <p>
|
* <p>
|
||||||
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
||||||
* calls in your code.
|
* calls in your code.
|
||||||
|
*
|
||||||
|
* While flexible, this can lead to long initialization times, so this feature
|
||||||
|
* can be disabled in eco.yml with the uses-reflective-reload option.
|
||||||
*/
|
*/
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
@Target(ElementType.METHOD)
|
@Target(ElementType.METHOD)
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ import java.util.Set;
|
|||||||
*
|
*
|
||||||
* @param <T> The type of the handle.
|
* @param <T> The type of the handle.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings({"MethodDoesntCallSuperMethod", "removal"})
|
@SuppressWarnings("MethodDoesntCallSuperMethod")
|
||||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||||
/**
|
/**
|
||||||
* Configs from eco have an internal implementation,
|
* Configs from eco have an internal implementation,
|
||||||
@@ -42,12 +42,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
|||||||
this.handle = handle;
|
this.handle = handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
|
||||||
public void clearCache() {
|
|
||||||
handle.clearCache();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toPlaintext() {
|
public String toPlaintext() {
|
||||||
return handle.toPlaintext();
|
return handle.toPlaintext();
|
||||||
|
|||||||
@@ -0,0 +1,85 @@
|
|||||||
|
package com.willfp.eco.core.data;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A simple store key-value store for data to be stored outside of plugins.
|
||||||
|
*/
|
||||||
|
public final class ExternalDataStore {
|
||||||
|
/**
|
||||||
|
* The store.
|
||||||
|
*/
|
||||||
|
private static final HashMap<String, Object> data = new HashMap<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Put data into the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param value The value.
|
||||||
|
*/
|
||||||
|
public static void put(@NotNull final String key,
|
||||||
|
@NotNull final Object value) {
|
||||||
|
data.put(key, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz) {
|
||||||
|
Object value = data.get(key);
|
||||||
|
|
||||||
|
if (clazz.isInstance(value)) {
|
||||||
|
return clazz.cast(value);
|
||||||
|
} else {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz,
|
||||||
|
@NotNull final T defaultValue) {
|
||||||
|
T value = get(key, clazz);
|
||||||
|
return value == null ? defaultValue : value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get data from the store.
|
||||||
|
*
|
||||||
|
* @param key The key.
|
||||||
|
* @param clazz The class.
|
||||||
|
* @param defaultValue The default value.
|
||||||
|
* @param <T> The type.
|
||||||
|
* @return The value.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static <T> T get(@NotNull final String key,
|
||||||
|
@NotNull final Class<T> clazz,
|
||||||
|
@NotNull final Supplier<T> defaultValue) {
|
||||||
|
return get(key, clazz, defaultValue.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
private ExternalDataStore() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -82,44 +82,6 @@ public final class PersistentDataKey<T> {
|
|||||||
return this.type;
|
return this.type;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* In older eco versions, keys would have to be categorized in order
|
|
||||||
* to register the columns in the MySQL database. This is no longer needed.
|
|
||||||
* <p>
|
|
||||||
* Old description is below:
|
|
||||||
* <p>
|
|
||||||
* Categorize key as a server key, will register new column to MySQL
|
|
||||||
* database immediately rather than waiting for auto-categorization.
|
|
||||||
* <p>
|
|
||||||
* This will improve performance.
|
|
||||||
*
|
|
||||||
* @return The key.
|
|
||||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
|
||||||
public PersistentDataKey<T> server() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* In older eco versions, keys would have to be categorized in order
|
|
||||||
* to register the columns in the MySQL database. This is no longer needed.
|
|
||||||
* <p>
|
|
||||||
* Old description is below:
|
|
||||||
* <p>
|
|
||||||
* Categorize key as a player key, will register new column to MySQL
|
|
||||||
* database immediately rather than waiting for auto-categorization.
|
|
||||||
* <p>
|
|
||||||
* This will improve performance.
|
|
||||||
*
|
|
||||||
* @return The key.
|
|
||||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
|
||||||
public PersistentDataKey<T> player() {
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all persistent data keys.
|
* Get all persistent data keys.
|
||||||
*
|
*
|
||||||
@@ -134,7 +96,7 @@ public final class PersistentDataKey<T> {
|
|||||||
if (this == o) {
|
if (this == o) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(o instanceof PersistentDataKey that)) {
|
if (!(o instanceof PersistentDataKey<?> that)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Objects.equals(this.getKey(), that.getKey());
|
return Objects.equals(this.getKey(), that.getKey());
|
||||||
|
|||||||
@@ -22,55 +22,38 @@ public final class PersistentDataKeyType<T> {
|
|||||||
/**
|
/**
|
||||||
* String.
|
* String.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>(String.class, "STRING");
|
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>("STRING");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Boolean.
|
* Boolean.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>(Boolean.class, "BOOLEAN");
|
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>("BOOLEAN");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Int.
|
* Int.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>(Integer.class, "INT");
|
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>("INT");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Double.
|
* Double.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>(Double.class, "DOUBLE");
|
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>("DOUBLE");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* String List.
|
* String List.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>(null, "STRING_LIST");
|
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>("STRING_LIST");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Config.
|
* Config.
|
||||||
*/
|
*/
|
||||||
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>(Config.class, "CONFIG");
|
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>("CONFIG");
|
||||||
|
|
||||||
/**
|
|
||||||
* The class of the type.
|
|
||||||
*/
|
|
||||||
private final Class<T> typeClass;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The name of the key type.
|
* The name of the key type.
|
||||||
*/
|
*/
|
||||||
private final String name;
|
private final String name;
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the class of the type.
|
|
||||||
*
|
|
||||||
* @return The class.
|
|
||||||
* @deprecated String list type will return null.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.36.0", forRemoval = true)
|
|
||||||
@Nullable
|
|
||||||
public Class<T> getTypeClass() {
|
|
||||||
return typeClass;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the name of the key type.
|
* Get the name of the key type.
|
||||||
*
|
*
|
||||||
@@ -83,14 +66,11 @@ public final class PersistentDataKeyType<T> {
|
|||||||
/**
|
/**
|
||||||
* Create new PersistentDataKeyType.
|
* Create new PersistentDataKeyType.
|
||||||
*
|
*
|
||||||
* @param typeClass The type class.
|
|
||||||
* @param name The name.
|
* @param name The name.
|
||||||
*/
|
*/
|
||||||
private PersistentDataKeyType(@Nullable final Class<T> typeClass,
|
private PersistentDataKeyType(@NotNull final String name) {
|
||||||
@NotNull final String name) {
|
|
||||||
VALUES.add(this);
|
VALUES.add(this);
|
||||||
|
|
||||||
this.typeClass = typeClass;
|
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -99,7 +79,7 @@ public final class PersistentDataKeyType<T> {
|
|||||||
if (this == that) {
|
if (this == that) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (!(that instanceof PersistentDataKeyType type)) {
|
if (!(that instanceof PersistentDataKeyType<?> type)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return Objects.equals(this.name, type.name);
|
return Objects.equals(this.name, type.name);
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.willfp.eco.core.display;
|
package com.willfp.eco.core.display;
|
||||||
|
|
||||||
import com.willfp.eco.core.fast.FastItemStack;
|
import com.willfp.eco.core.fast.FastItemStack;
|
||||||
|
import com.willfp.eco.core.integrations.guidetection.GUIDetectionManager;
|
||||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
@@ -18,6 +19,9 @@ import java.util.TreeMap;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Utility class to manage client-side item display.
|
* Utility class to manage client-side item display.
|
||||||
|
* <p>
|
||||||
|
* Packet display is not done on the main thread, so make sure
|
||||||
|
* all your modules are thread-safe.
|
||||||
*/
|
*/
|
||||||
public final class Display {
|
public final class Display {
|
||||||
/**
|
/**
|
||||||
@@ -71,7 +75,7 @@ public final class Display {
|
|||||||
ItemStack original = itemStack.clone();
|
ItemStack original = itemStack.clone();
|
||||||
Inventory inventory = player == null ? null : player.getOpenInventory().getTopInventory();
|
Inventory inventory = player == null ? null : player.getOpenInventory().getTopInventory();
|
||||||
boolean inInventory = inventory != null && inventory.contains(original);
|
boolean inInventory = inventory != null && inventory.contains(original);
|
||||||
boolean inGui = inventory != null && inventory.getHolder() == null;
|
boolean inGui = player != null && GUIDetectionManager.hasGUIOpen(player);
|
||||||
|
|
||||||
DisplayProperties properties = new DisplayProperties(
|
DisplayProperties properties = new DisplayProperties(
|
||||||
inInventory,
|
inInventory,
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Class for all plugin-specific client-side item display modules.
|
* Class for all plugin-specific client-side item display modules.
|
||||||
|
* <p>
|
||||||
|
* Display modules are called in the netty thread, so make sure they are thread-safe.
|
||||||
*/
|
*/
|
||||||
public abstract class DisplayModule {
|
public abstract class DisplayModule {
|
||||||
/**
|
/**
|
||||||
@@ -110,23 +112,6 @@ public abstract class DisplayModule {
|
|||||||
return this.getPlugin().getName();
|
return this.getPlugin().getName();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the display priority.
|
|
||||||
*
|
|
||||||
* @return The priority.
|
|
||||||
* @deprecated Use getWeight instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public DisplayPriority getPriority() {
|
|
||||||
return switch (this.weight) {
|
|
||||||
case 100 -> DisplayPriority.LOWEST;
|
|
||||||
case 200 -> DisplayPriority.LOW;
|
|
||||||
case 300 -> DisplayPriority.HIGH;
|
|
||||||
case 400 -> DisplayPriority.HIGHEST;
|
|
||||||
default -> DisplayPriority.CUSTOM;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the display weight.
|
* Get the display weight.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -6,7 +6,10 @@ package com.willfp.eco.core.display;
|
|||||||
public enum DisplayPriority {
|
public enum DisplayPriority {
|
||||||
/**
|
/**
|
||||||
* Custom weight.
|
* Custom weight.
|
||||||
|
*
|
||||||
|
* @deprecated Will never be used.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||||
CUSTOM(250),
|
CUSTOM(250),
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -20,6 +20,13 @@ public abstract class CustomGoal<T extends Mob> implements EntityGoal<T>, Target
|
|||||||
*/
|
*/
|
||||||
private final Set<GoalFlag> flags = EnumSet.noneOf(GoalFlag.class);
|
private final Set<GoalFlag> flags = EnumSet.noneOf(GoalFlag.class);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new custom goal.
|
||||||
|
*/
|
||||||
|
protected CustomGoal() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initialize the goal with a mob.
|
* Initialize the goal with a mob.
|
||||||
* <p>
|
* <p>
|
||||||
|
|||||||
@@ -13,10 +13,10 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
/**
|
/**
|
||||||
* Avoid entities.
|
* Avoid entities.
|
||||||
*
|
*
|
||||||
* @param entity The entity type to avoid.
|
* @param entity The entity type to avoid.
|
||||||
* @param distance The distance to flee to.
|
* @param distance The distance to flee to.
|
||||||
* @param slowSpeed The slow movement speed.
|
* @param slowSpeed The slow movement speed.
|
||||||
* @param fastSpeed The fast movement speed.
|
* @param fastSpeed The fast movement speed.
|
||||||
*/
|
*/
|
||||||
public record EntityGoalAvoidEntity(
|
public record EntityGoalAvoidEntity(
|
||||||
@NotNull TestableEntity entity,
|
@NotNull TestableEntity entity,
|
||||||
@@ -45,23 +45,14 @@ public record EntityGoalAvoidEntity(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
TestableEntity entity = Entities.lookup(config.getString("entity"));
|
||||||
TestableEntity entity = Entities.lookup(config.getString("entity"));
|
|
||||||
|
|
||||||
return new EntityGoalAvoidEntity(
|
return new EntityGoalAvoidEntity(
|
||||||
entity,
|
entity,
|
||||||
config.getDouble("distance"),
|
config.getDouble("distance"),
|
||||||
config.getDouble("slowSpeed"),
|
config.getDouble("slowSpeed"),
|
||||||
config.getDouble("fastSpeed")
|
config.getDouble("fastSpeed")
|
||||||
);
|
);
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalBreakDoors(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalBreakDoors(
|
||||||
return new EntityGoalBreakDoors(
|
config.getInt("ticks")
|
||||||
config.getInt("ticks")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalBreed(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalBreed(
|
||||||
return new EntityGoalBreed(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalCatLieOnBed(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalCatLieOnBed(
|
||||||
return new EntityGoalCatLieOnBed(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getInt("range")
|
||||||
config.getInt("range")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalCatSitOnBed(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalCatSitOnBed(
|
||||||
return new EntityGoalCatSitOnBed(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalFleeSun(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalFleeSun(
|
||||||
return new EntityGoalFleeSun(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -40,20 +40,11 @@ public record EntityGoalFollowMobs(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalFollowMobs(
|
||||||
return new EntityGoalFollowMobs(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getDouble("minDistance"),
|
||||||
config.getDouble("minDistance"),
|
config.getDouble("maxDistance")
|
||||||
config.getDouble("maxDistance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -42,20 +42,11 @@ public record EntityGoalInteract(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalInteract(
|
||||||
return new EntityGoalInteract(
|
Entities.lookup(config.getString("target")),
|
||||||
Entities.lookup(config.getString("target")),
|
config.getDouble("range"),
|
||||||
config.getDouble("range"),
|
config.getDouble("chance")
|
||||||
config.getDouble("chance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalLeapAtTarget(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalLeapAtTarget(
|
||||||
return new EntityGoalLeapAtTarget(
|
config.getDouble("velocity")
|
||||||
config.getDouble("velocity")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalLookAtPlayer(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalLookAtPlayer(
|
||||||
return new EntityGoalLookAtPlayer(
|
config.getDouble("range"),
|
||||||
config.getDouble("range"),
|
config.getDouble("chance")
|
||||||
config.getDouble("chance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalMeleeAttack(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalMeleeAttack(
|
||||||
return new EntityGoalMeleeAttack(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getBool("pauseWhenMobIdle")
|
||||||
config.getBool("pauseWhenMobIdle")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalMoveBackToVillage(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalMoveBackToVillage(
|
||||||
return new EntityGoalMoveBackToVillage(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getBool("canDespawn")
|
||||||
config.getBool("canDespawn")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -43,21 +43,12 @@ public record EntityGoalMoveThroughVillage(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalMoveThroughVillage(
|
||||||
return new EntityGoalMoveThroughVillage(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getBool("onlyAtNight"),
|
||||||
config.getBool("onlyAtNight"),
|
config.getInt("distance"),
|
||||||
config.getInt("distance"),
|
config.getBool("canPassThroughDoors")
|
||||||
config.getBool("canPassThroughDoors")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalMoveTowardsRestriction(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalMoveTowardsRestriction(
|
||||||
return new EntityGoalMoveTowardsRestriction(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalMoveTowardsTarget(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalMoveTowardsTarget(
|
||||||
return new EntityGoalMoveTowardsTarget(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getDouble("maxDistance")
|
||||||
config.getDouble("maxDistance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalOpenDoors(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalOpenDoors(
|
||||||
return new EntityGoalOpenDoors(
|
config.getBool("delayClosing")
|
||||||
config.getBool("delayClosing")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalPanic(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalPanic(
|
||||||
return new EntityGoalPanic(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -40,20 +40,11 @@ public record EntityGoalRandomStroll(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalRandomStroll(
|
||||||
return new EntityGoalRandomStroll(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getInt("interval"),
|
||||||
config.getInt("interval"),
|
config.getBool("canDespawn")
|
||||||
config.getBool("canDespawn")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalRandomSwimming(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalRandomSwimming(
|
||||||
return new EntityGoalRandomSwimming(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getInt("interval")
|
||||||
config.getInt("interval")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -45,21 +45,12 @@ public record EntityGoalRangedAttack(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalRangedAttack(
|
||||||
return new EntityGoalRangedAttack(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getInt("minInterval"),
|
||||||
config.getInt("minInterval"),
|
config.getInt("maxInterval"),
|
||||||
config.getInt("maxInterval"),
|
config.getDouble("range")
|
||||||
config.getDouble("range")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -13,9 +13,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
* <p>
|
* <p>
|
||||||
* Only supports monsters that have bow attacks.
|
* Only supports monsters that have bow attacks.
|
||||||
*
|
*
|
||||||
* @param speed The speed.
|
* @param speed The speed.
|
||||||
* @param interval The interval between attacks (in ticks).
|
* @param interval The interval between attacks (in ticks).
|
||||||
* @param range The max range at which to attack.
|
* @param range The max range at which to attack.
|
||||||
*/
|
*/
|
||||||
public record EntityGoalRangedBowAttack(
|
public record EntityGoalRangedBowAttack(
|
||||||
double speed,
|
double speed,
|
||||||
@@ -42,20 +42,11 @@ public record EntityGoalRangedBowAttack(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalRangedBowAttack(
|
||||||
return new EntityGoalRangedBowAttack(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getInt("interval"),
|
||||||
config.getInt("interval"),
|
config.getDouble("range")
|
||||||
config.getDouble("range")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -39,19 +39,10 @@ public record EntityGoalRangedCrossbowAttack(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalRangedCrossbowAttack(
|
||||||
return new EntityGoalRangedCrossbowAttack(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getDouble("range")
|
||||||
config.getDouble("range")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalStrollThroughVillage(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalStrollThroughVillage(
|
||||||
return new EntityGoalStrollThroughVillage(
|
config.getInt("searchRange")
|
||||||
config.getInt("searchRange")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -28,6 +28,8 @@ public record EntityGoalTempt(
|
|||||||
boolean canBeScared
|
boolean canBeScared
|
||||||
) implements EntityGoal<Mob> {
|
) implements EntityGoal<Mob> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new entity goal.
|
||||||
|
*
|
||||||
* @param speed The speed at which the entity follows the item.
|
* @param speed The speed at which the entity follows the item.
|
||||||
* @param item The item that the entity will be attracted by.
|
* @param item The item that the entity will be attracted by.
|
||||||
* @param canBeScared If the entity can be scared and lose track of the item.
|
* @param canBeScared If the entity can be scared and lose track of the item.
|
||||||
@@ -58,25 +60,16 @@ public record EntityGoalTempt(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
Collection<TestableItem> items = config.getStrings("items").stream()
|
||||||
Collection<TestableItem> items = config.getStrings("items").stream()
|
.map(Items::lookup)
|
||||||
.map(Items::lookup)
|
.filter(it -> !(it instanceof EmptyTestableItem))
|
||||||
.filter(it -> !(it instanceof EmptyTestableItem))
|
.collect(Collectors.toList());
|
||||||
.collect(Collectors.toList());
|
|
||||||
|
|
||||||
return new EntityGoalTempt(
|
return new EntityGoalTempt(
|
||||||
config.getDouble("speed"),
|
config.getDouble("speed"),
|
||||||
items,
|
items,
|
||||||
config.getBool("canBeScared")
|
config.getBool("canBeScared")
|
||||||
);
|
);
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -48,22 +48,13 @@ public record EntityGoalUseItem(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
TestableEntity filter = Entities.lookup(config.getString("condition"));
|
||||||
TestableEntity filter = Entities.lookup(config.getString("condition"));
|
|
||||||
|
|
||||||
return new EntityGoalUseItem(
|
return new EntityGoalUseItem(
|
||||||
Items.lookup(config.getString("item")).getItem(),
|
Items.lookup(config.getString("item")).getItem(),
|
||||||
Sound.valueOf(config.getString("sound").toUpperCase()),
|
Sound.valueOf(config.getString("sound").toUpperCase()),
|
||||||
filter::matches
|
filter::matches
|
||||||
);
|
);
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalWaterAvoidingRandomFlying(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalWaterAvoidingRandomFlying(
|
||||||
return new EntityGoalWaterAvoidingRandomFlying(
|
config.getDouble("speed")
|
||||||
config.getDouble("speed")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,19 +37,10 @@ public record EntityGoalWaterAvoidingRandomStroll(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalWaterAvoidingRandomStroll(
|
||||||
return new EntityGoalWaterAvoidingRandomStroll(
|
config.getDouble("speed"),
|
||||||
config.getDouble("speed"),
|
config.getDouble("chance")
|
||||||
config.getDouble("chance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -34,18 +34,9 @@ public record EntityGoalWolfBeg(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new EntityGoalWolfBeg(
|
||||||
return new EntityGoalWolfBeg(
|
config.getDouble("distance")
|
||||||
config.getDouble("distance")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -37,18 +37,9 @@ public record TargetGoalHurtBy(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new TargetGoalHurtBy(
|
||||||
return new TargetGoalHurtBy(
|
Entities.lookup(config.getString("blacklist"))
|
||||||
Entities.lookup(config.getString("blacklist"))
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackable(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The type of entities to attack.
|
* @param target The type of entities to attack.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
* @param checkCanNavigate If navigation should be checked.
|
* @param checkCanNavigate If navigation should be checked.
|
||||||
@@ -63,32 +65,23 @@ public record TargetGoalNearestAttackable(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (config.has("targetFilter")) {
|
||||||
if (config.has("targetFilter")) {
|
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
|
||||||
|
|
||||||
return new TargetGoalNearestAttackable(
|
return new TargetGoalNearestAttackable(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
config.getBool("checkCanNavigate"),
|
config.getBool("checkCanNavigate"),
|
||||||
config.getInt("reciprocalChance"),
|
config.getInt("reciprocalChance"),
|
||||||
filter::matches
|
filter::matches
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return new TargetGoalNearestAttackable(
|
return new TargetGoalNearestAttackable(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
config.getBool("checkCanNavigate"),
|
config.getBool("checkCanNavigate"),
|
||||||
config.getInt("reciprocalChance")
|
config.getInt("reciprocalChance")
|
||||||
);
|
);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackableWitch(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The type of entities to attack.
|
* @param target The type of entities to attack.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
* @param checkCanNavigate If navigation should be checked.
|
* @param checkCanNavigate If navigation should be checked.
|
||||||
@@ -63,32 +65,23 @@ public record TargetGoalNearestAttackableWitch(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (config.has("targetFilter")) {
|
||||||
if (config.has("targetFilter")) {
|
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
|
||||||
|
|
||||||
return new TargetGoalNearestAttackableWitch(
|
return new TargetGoalNearestAttackableWitch(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
config.getBool("checkCanNavigate"),
|
config.getBool("checkCanNavigate"),
|
||||||
config.getInt("reciprocalChance"),
|
config.getInt("reciprocalChance"),
|
||||||
filter::matches
|
filter::matches
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return new TargetGoalNearestAttackableWitch(
|
return new TargetGoalNearestAttackableWitch(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
config.getBool("checkCanNavigate"),
|
config.getBool("checkCanNavigate"),
|
||||||
config.getInt("reciprocalChance")
|
config.getInt("reciprocalChance")
|
||||||
);
|
);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ public record TargetGoalNearestHealableRaider(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Raider> {
|
) implements TargetGoal<Raider> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The target.
|
* @param target The target.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
*/
|
*/
|
||||||
@@ -53,28 +55,19 @@ public record TargetGoalNearestHealableRaider(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (config.has("targetFilter")) {
|
||||||
if (config.has("targetFilter")) {
|
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
|
||||||
|
|
||||||
return new TargetGoalNearestHealableRaider(
|
return new TargetGoalNearestHealableRaider(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
filter::matches
|
filter::matches
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return new TargetGoalNearestHealableRaider(
|
return new TargetGoalNearestHealableRaider(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility")
|
config.getBool("checkVisibility")
|
||||||
);
|
);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -26,6 +26,8 @@ public record TargetGoalNonTameRandom(
|
|||||||
@NotNull Predicate<LivingEntity> targetFilter
|
@NotNull Predicate<LivingEntity> targetFilter
|
||||||
) implements TargetGoal<Tameable> {
|
) implements TargetGoal<Tameable> {
|
||||||
/**
|
/**
|
||||||
|
* Create a new target goal.
|
||||||
|
*
|
||||||
* @param target The types of entities to heal.
|
* @param target The types of entities to heal.
|
||||||
* @param checkVisibility If visibility should be checked.
|
* @param checkVisibility If visibility should be checked.
|
||||||
*/
|
*/
|
||||||
@@ -53,28 +55,19 @@ public record TargetGoalNonTameRandom(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
if (config.has("targetFilter")) {
|
||||||
if (config.has("targetFilter")) {
|
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
|
||||||
|
|
||||||
return new TargetGoalNonTameRandom(
|
return new TargetGoalNonTameRandom(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility"),
|
config.getBool("checkVisibility"),
|
||||||
filter::matches
|
filter::matches
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
return new TargetGoalNonTameRandom(
|
return new TargetGoalNonTameRandom(
|
||||||
Entities.lookup(config.getString("target")),
|
Entities.lookup(config.getString("target")),
|
||||||
config.getBool("checkVisibility")
|
config.getBool("checkVisibility")
|
||||||
);
|
);
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,18 +36,9 @@ public record TargetGoalResetUniversalAnger(
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
return new TargetGoalResetUniversalAnger(
|
||||||
return new TargetGoalResetUniversalAnger(
|
config.getBool("triggerOthers")
|
||||||
config.getBool("triggerOthers")
|
);
|
||||||
);
|
|
||||||
} catch (Exception e) {
|
|
||||||
/*
|
|
||||||
Exceptions could be caused by configs having values of a wrong type,
|
|
||||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
|
||||||
so we encapsulate them as null.
|
|
||||||
*/
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import java.util.function.Consumer;
|
|||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* The result of an arg parses.
|
||||||
|
*
|
||||||
* @param test The test for the entity.
|
* @param test The test for the entity.
|
||||||
* @param modifier The modifier to apply to the entity.
|
* @param modifier The modifier to apply to the entity.
|
||||||
* @see EntityArgParser
|
* @see EntityArgParser
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.events;
|
package com.willfp.eco.core.events;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.packet.PacketListener;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
@@ -25,4 +26,11 @@ public interface EventManager {
|
|||||||
* Unregister all listeners associated with the plugin.
|
* Unregister all listeners associated with the plugin.
|
||||||
*/
|
*/
|
||||||
void unregisterAllListeners();
|
void unregisterAllListeners();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a packet listener.
|
||||||
|
*
|
||||||
|
* @param listener The listener.
|
||||||
|
*/
|
||||||
|
void registerPacketListener(@NotNull PacketListener listener);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -20,18 +20,6 @@ import java.util.Set;
|
|||||||
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
||||||
*/
|
*/
|
||||||
public interface FastItemStack extends PersistentDataHolder {
|
public interface FastItemStack extends PersistentDataHolder {
|
||||||
/**
|
|
||||||
* Get all enchantments on an item.
|
|
||||||
*
|
|
||||||
* @param checkStored If stored NBT should also be checked.
|
|
||||||
* @return A map of all enchantments.
|
|
||||||
* @deprecated Poorly named method. Use getEnchants instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
|
||||||
default Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored) {
|
|
||||||
return getEnchants(checkStored);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get all enchantments on an item.
|
* Get all enchantments on an item.
|
||||||
* Does not account for stored enchants.
|
* Does not account for stored enchants.
|
||||||
@@ -51,33 +39,6 @@ public interface FastItemStack extends PersistentDataHolder {
|
|||||||
@NotNull
|
@NotNull
|
||||||
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the level of an enchantment on an item.
|
|
||||||
*
|
|
||||||
* @param enchantment The enchantment.
|
|
||||||
* @return The enchantment level, or 0 if not found.
|
|
||||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
|
||||||
default int getLevelOnItem(@NotNull Enchantment enchantment) {
|
|
||||||
return getEnchantmentLevel(enchantment, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the level of an enchantment on an item.
|
|
||||||
*
|
|
||||||
* @param enchantment The enchantment.
|
|
||||||
* @param checkStored If the stored NBT should also be checked.
|
|
||||||
* @return The enchantment level, or 0 if not found.
|
|
||||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
|
||||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
|
||||||
default int getLevelOnItem(@NotNull Enchantment enchantment,
|
|
||||||
boolean checkStored) {
|
|
||||||
return getEnchantmentLevel(enchantment, checkStored);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the level of an enchantment.
|
* Get the level of an enchantment.
|
||||||
*
|
*
|
||||||
@@ -85,7 +46,7 @@ public interface FastItemStack extends PersistentDataHolder {
|
|||||||
* @return The enchantment level, or 0 if not found.
|
* @return The enchantment level, or 0 if not found.
|
||||||
*/
|
*/
|
||||||
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
||||||
return getLevelOnItem(enchantment, false);
|
return getEnchantmentLevel(enchantment, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -3,20 +3,15 @@ package com.willfp.eco.core.gui.menu;
|
|||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.gui.page.Page;
|
import com.willfp.eco.core.gui.page.Page;
|
||||||
import com.willfp.eco.core.gui.slot.Slot;
|
import com.willfp.eco.core.gui.slot.Slot;
|
||||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
|
||||||
import org.bukkit.NamespacedKey;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.persistence.PersistentDataType;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.stream.Collectors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GUI version of {@link Inventory}.
|
* GUI version of {@link Inventory}.
|
||||||
@@ -240,58 +235,6 @@ public interface Menu {
|
|||||||
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Write data.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param key The key.
|
|
||||||
* @param type The type.
|
|
||||||
* @param value The value.
|
|
||||||
* @param <T> The type.
|
|
||||||
* @param <Z> The type.
|
|
||||||
* @deprecated Use addState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default <T, Z> void writeData(@NotNull final Player player,
|
|
||||||
@NotNull final NamespacedKey key,
|
|
||||||
@NotNull final PersistentDataType<T, Z> type,
|
|
||||||
@NotNull final Z value) {
|
|
||||||
this.setState(player, key.toString(), value);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Read data.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param key The key.
|
|
||||||
* @param type The type.
|
|
||||||
* @param <T> The type.
|
|
||||||
* @param <Z> The type.
|
|
||||||
* @return The data.
|
|
||||||
* @deprecated Use getState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default @Nullable <T, Z> T readData(@NotNull final Player player,
|
|
||||||
@NotNull final NamespacedKey key,
|
|
||||||
@NotNull final PersistentDataType<T, Z> type) {
|
|
||||||
return this.getState(player, key.toString());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get all data keys for a player.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @return The keys.
|
|
||||||
* @deprecated Use getState instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
default Set<NamespacedKey> getKeys(@NotNull final Player player) {
|
|
||||||
return this.getState(player).keySet().stream()
|
|
||||||
.map(NamespacedKeyUtils::fromStringOrNull)
|
|
||||||
.filter(Objects::nonNull)
|
|
||||||
.collect(Collectors.toSet());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a builder with a given amount of rows.
|
* Create a builder with a given amount of rows.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -139,7 +139,7 @@ public interface MenuBuilder extends PageBuilder {
|
|||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
default MenuBuilder maxPages(@NotNull final Function<Player, Integer> pages) {
|
default MenuBuilder maxPages(@NotNull final Function<Player, Integer> pages) {
|
||||||
return onRender((player, menu) -> menu.setState(player, Page.MAX_PAGE_KEY, pages.apply(player)));
|
return this.onRender((player, menu) -> menu.setState(player, Page.MAX_PAGE_KEY, pages.apply(player)));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,12 +1,14 @@
|
|||||||
package com.willfp.eco.core.gui.slot;
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
import com.willfp.eco.core.config.interfaces.Config;
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import com.willfp.eco.core.fast.FastItemStack;
|
||||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||||
import com.willfp.eco.core.items.Items;
|
import com.willfp.eco.core.items.Items;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.ClickType;
|
import org.bukkit.event.inventory.ClickType;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@@ -37,7 +39,25 @@ public class ConfigSlot extends CustomSlot {
|
|||||||
public ConfigSlot(@NotNull final Config config) {
|
public ConfigSlot(@NotNull final Config config) {
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
|
||||||
SlotBuilder builder = Slot.builder(Items.lookup(config.getString("item")));
|
ItemStack item = Items.lookup(config.getString("item")).getItem();
|
||||||
|
|
||||||
|
SlotBuilder builder = Slot.builder((player, menu) -> {
|
||||||
|
if (!config.has("lore")) {
|
||||||
|
return item;
|
||||||
|
} else {
|
||||||
|
FastItemStack fast = FastItemStack.wrap(item.clone());
|
||||||
|
List<String> newLore = new ArrayList<>(fast.getLore());
|
||||||
|
newLore.addAll(
|
||||||
|
StringUtils.formatList(
|
||||||
|
config.getStrings("lore"),
|
||||||
|
player,
|
||||||
|
StringUtils.FormatOption.WITH_PLACEHOLDERS
|
||||||
|
)
|
||||||
|
);
|
||||||
|
fast.setLore(newLore);
|
||||||
|
return fast.unwrap();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
for (ClickType clickType : ClickType.values()) {
|
for (ClickType clickType : ClickType.values()) {
|
||||||
builder.onClick(
|
builder.onClick(
|
||||||
|
|||||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.gui.menu.Menu;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for custom slot implementations.
|
* Base class for custom slot implementations.
|
||||||
@@ -31,7 +32,7 @@ public abstract class CustomSlot implements Slot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull ItemStack getItemStack(@NotNull final Player player) {
|
public final @NotNull ItemStack getItemStack(@NotNull final Player player) {
|
||||||
if (delegate == null) {
|
if (delegate == null) {
|
||||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||||
}
|
}
|
||||||
@@ -40,8 +41,8 @@ public abstract class CustomSlot implements Slot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCaptive(@NotNull final Player player,
|
public final boolean isCaptive(@NotNull final Player player,
|
||||||
@NotNull final Menu menu) {
|
@NotNull final Menu menu) {
|
||||||
if (delegate == null) {
|
if (delegate == null) {
|
||||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||||
}
|
}
|
||||||
@@ -50,7 +51,18 @@ public abstract class CustomSlot implements Slot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCaptiveFromEmpty() {
|
public final boolean isAllowedCaptive(@NotNull final Player player,
|
||||||
|
@NotNull final Menu menu,
|
||||||
|
@Nullable final ItemStack itemStack) {
|
||||||
|
if (delegate == null) {
|
||||||
|
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||||
|
}
|
||||||
|
|
||||||
|
return delegate.isAllowedCaptive(player, menu, itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean isCaptiveFromEmpty() {
|
||||||
if (delegate == null) {
|
if (delegate == null) {
|
||||||
throw new IllegalStateException("Custom Slot was not initialized!");
|
throw new IllegalStateException("Custom Slot was not initialized!");
|
||||||
}
|
}
|
||||||
@@ -59,8 +71,8 @@ public abstract class CustomSlot implements Slot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final Slot getActionableSlot(@NotNull final Player player,
|
public final @NotNull Slot getActionableSlot(@NotNull final Player player,
|
||||||
@NotNull final Menu menu) {
|
@NotNull final Menu menu) {
|
||||||
return delegate;
|
return delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,17 +90,4 @@ public abstract class CustomSlot implements Slot {
|
|||||||
public final Slot getSlotAt(int row, int column) {
|
public final Slot getSlotAt(int row, int column) {
|
||||||
return Slot.super.getSlotAt(row, column);
|
return Slot.super.getSlotAt(row, column);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the delegate slot.
|
|
||||||
* <p>
|
|
||||||
* This is not required to add the slot to a menu, but is instead used internally.
|
|
||||||
*
|
|
||||||
* @return The slot.
|
|
||||||
* @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)}
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
public Slot getDelegate() {
|
|
||||||
return this.delegate;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Base class for custom slot implementations.
|
* Base class for custom slot implementations.
|
||||||
@@ -34,11 +35,18 @@ public abstract class ReactiveSlot implements Slot {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isCaptive(@NotNull final Player player,
|
public final boolean isCaptive(@NotNull final Player player,
|
||||||
@NotNull final Menu menu) {
|
@NotNull final Menu menu) {
|
||||||
return getSlot(player, menu).isCaptive(player, menu);
|
return getSlot(player, menu).isCaptive(player, menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final boolean isAllowedCaptive(@NotNull final Player player,
|
||||||
|
@NotNull final Menu menu,
|
||||||
|
@Nullable final ItemStack itemStack) {
|
||||||
|
return getSlot(player, menu).isAllowedCaptive(player, menu, itemStack);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public final @NotNull Slot getActionableSlot(@NotNull final Player player,
|
public final @NotNull Slot getActionableSlot(@NotNull final Player player,
|
||||||
@NotNull final Menu menu) {
|
@NotNull final Menu menu) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import org.bukkit.Material;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
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;
|
||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
@@ -45,6 +46,20 @@ public interface Slot extends GUIComponent {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If the slot allows a certain item to be placed in it.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @param menu The menu.
|
||||||
|
* @param itemStack The item; use null if the item is unknown.
|
||||||
|
* @return If captive.
|
||||||
|
*/
|
||||||
|
default boolean isAllowedCaptive(@NotNull final Player player,
|
||||||
|
@NotNull final Menu menu,
|
||||||
|
@Nullable final ItemStack itemStack) {
|
||||||
|
return this.isCaptive(player, menu);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the actionable slot to be shown.
|
* Get the actionable slot to be shown.
|
||||||
* <p>
|
* <p>
|
||||||
@@ -143,27 +158,4 @@ public interface Slot extends GUIComponent {
|
|||||||
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
||||||
return Eco.get().createSlotBuilder(provider);
|
return Eco.get().createSlotBuilder(provider);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* If the slot is not captive for a player.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @return If not captive for the player.
|
|
||||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
default boolean isNotCaptiveFor(@NotNull Player player) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the slot is captive. (Can items be placed in it).
|
|
||||||
*
|
|
||||||
* @return If captive.
|
|
||||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
|
||||||
default boolean isCaptive() {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.willfp.eco.core.gui.slot;
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.gui.slot.functional.CaptiveFilter;
|
||||||
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
import com.willfp.eco.core.gui.slot.functional.SlotHandler;
|
||||||
import com.willfp.eco.core.gui.slot.functional.SlotModifier;
|
import com.willfp.eco.core.gui.slot.functional.SlotModifier;
|
||||||
import com.willfp.eco.core.gui.slot.functional.SlotUpdater;
|
import com.willfp.eco.core.gui.slot.functional.SlotUpdater;
|
||||||
@@ -143,7 +144,17 @@ public interface SlotBuilder {
|
|||||||
* @param predicate The predicate. Returns true when the slot should not be captive.
|
* @param predicate The predicate. Returns true when the slot should not be captive.
|
||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
SlotBuilder notCaptiveFor(@NotNull Predicate<Player> predicate);
|
SlotBuilder notCaptiveFor(@NotNull final Predicate<Player> predicate);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a whitelist for allowed captive items.
|
||||||
|
*
|
||||||
|
* @param filter The filter.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
default SlotBuilder setCaptiveFilter(@NotNull final CaptiveFilter filter) {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the ItemStack updater.
|
* Set the ItemStack updater.
|
||||||
|
|||||||
@@ -0,0 +1,25 @@
|
|||||||
|
package com.willfp.eco.core.gui.slot.functional;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.gui.menu.Menu;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface to test if a captive slot is allowed to contain an item given a player and a menu.
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
public interface CaptiveFilter {
|
||||||
|
/**
|
||||||
|
* Get if allowed.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @param menu The menu.
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @return If captive.
|
||||||
|
*/
|
||||||
|
boolean isAllowed(@NotNull Player player,
|
||||||
|
@NotNull Menu menu,
|
||||||
|
@Nullable ItemStack itemStack);
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.afk;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for afk integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AFKIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AFKWrapper extends AFKIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.willfp.eco.core.integrations.anticheat;
|
package com.willfp.eco.core.integrations.anticheat;
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -18,19 +17,6 @@ public final class AnticheatManager {
|
|||||||
*/
|
*/
|
||||||
private static final Set<AnticheatIntegration> ANTICHEATS = new HashSet<>();
|
private static final Set<AnticheatIntegration> ANTICHEATS = new HashSet<>();
|
||||||
|
|
||||||
/**
|
|
||||||
* Register a new anticheat.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @param anticheat The anticheat to register.
|
|
||||||
* @deprecated Don't pass instance of eco.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public static void register(@NotNull final EcoPlugin plugin,
|
|
||||||
@NotNull final AnticheatIntegration anticheat) {
|
|
||||||
register(anticheat);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register a new anticheat.
|
* Register a new anticheat.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.anticheat;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for anticheat integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AnticheatIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AnticheatWrapper extends AnticheatIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.antigrief;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for antigrief integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use AntigriefIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface AntigriefWrapper extends AntigriefIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.customentities;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for custom item integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use CustomEntitiesIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface CustomEntitiesWrapper extends CustomEntitiesIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.customitems;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for custom item integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use CustomItemsIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface CustomItemsWrapper extends CustomItemsIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.economy;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for economy integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use EconomyIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface EconomyWrapper extends EconomyIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.willfp.eco.core.integrations.guidetection;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.integrations.Integration;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for GUI integrations.
|
||||||
|
*/
|
||||||
|
public interface GUIDetectionIntegration extends Integration {
|
||||||
|
/**
|
||||||
|
* Determine if a player is in a GUI.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @return If the player is in a GUI.
|
||||||
|
*/
|
||||||
|
boolean hasGUIOpen(@NotNull final Player player);
|
||||||
|
}
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
package com.willfp.eco.core.integrations.guidetection;
|
||||||
|
|
||||||
|
import com.willfp.eco.util.MenuUtils;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle GUI detection.
|
||||||
|
*/
|
||||||
|
public final class GUIDetectionManager {
|
||||||
|
/**
|
||||||
|
* A set of all registered integrations.
|
||||||
|
*/
|
||||||
|
private static final Set<GUIDetectionIntegration> REGISTERED = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new integration.
|
||||||
|
*
|
||||||
|
* @param integration The integration to register.
|
||||||
|
*/
|
||||||
|
public static void register(@NotNull final GUIDetectionIntegration integration) {
|
||||||
|
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||||
|
REGISTERED.add(integration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if a player is in a GUI.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @return If the player has a GUI open.
|
||||||
|
*/
|
||||||
|
public static boolean hasGUIOpen(@NotNull final Player player) {
|
||||||
|
if (MenuUtils.getOpenMenu(player) != null) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (GUIDetectionIntegration integration : REGISTERED) {
|
||||||
|
if (integration.hasGUIOpen(player)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
private GUIDetectionManager() {
|
||||||
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.hologram;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for hologram integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use HologramIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface HologramWrapper extends HologramIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -33,10 +33,15 @@ public final class McmmoManager {
|
|||||||
* @return The bonus drop count.
|
* @return The bonus drop count.
|
||||||
*/
|
*/
|
||||||
public static int getBonusDropCount(@NotNull final Block block) {
|
public static int getBonusDropCount(@NotNull final Block block) {
|
||||||
|
int finalValue = 0;
|
||||||
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
||||||
return mcmmoIntegration.getBonusDropCount(block);
|
finalValue += mcmmoIntegration.getBonusDropCount(block);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
return 0;
|
return finalValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -47,7 +52,10 @@ public final class McmmoManager {
|
|||||||
*/
|
*/
|
||||||
public static boolean isFake(@NotNull final Event event) {
|
public static boolean isFake(@NotNull final Event event) {
|
||||||
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
for (McmmoIntegration mcmmoIntegration : REGISTERED) {
|
||||||
return mcmmoIntegration.isFake(event);
|
if (mcmmoIntegration.isFake(event)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.mcmmo;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for mcmmo integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use McmmoIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface McmmoWrapper extends McmmoIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,190 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.placeholder;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.Eco;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import com.willfp.eco.core.placeholder.Placeholder;
|
|
||||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
|
||||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
|
||||||
import org.apache.commons.lang.Validate;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.function.Function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A placeholder entry is a placeholder in and of itself.
|
|
||||||
* <p>
|
|
||||||
* It should be fairly straightforward.
|
|
||||||
*
|
|
||||||
* @deprecated Confusing functionality with inconsistent nullability and poor naming.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
|
||||||
public class PlaceholderEntry {
|
|
||||||
/**
|
|
||||||
* The name of the placeholder, used in lookups.
|
|
||||||
*/
|
|
||||||
private final String identifier;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The lambda to retrieve the output of the placeholder given a player.
|
|
||||||
*/
|
|
||||||
private final Function<Player, String> function;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* If the placeholder requires a player to lookup.
|
|
||||||
*/
|
|
||||||
private final boolean requiresPlayer;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The plugin for the placeholder.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
private final EcoPlugin plugin;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that doesn't require a player.
|
|
||||||
*
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder given a player.
|
|
||||||
* @deprecated Specify a plugin.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function) {
|
|
||||||
this(identifier, function, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that may require a player.
|
|
||||||
*
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder.
|
|
||||||
* @param requiresPlayer If the placeholder requires a player.
|
|
||||||
* @deprecated Specify a plugin.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public PlaceholderEntry(@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function,
|
|
||||||
final boolean requiresPlayer) {
|
|
||||||
this(null, identifier, function, requiresPlayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that doesn't require a player.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin for the placeholder.
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder given a player.
|
|
||||||
*/
|
|
||||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
|
||||||
@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function) {
|
|
||||||
this(plugin, identifier, function, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a placeholder entry that may require a player.
|
|
||||||
*
|
|
||||||
* @param plugin The plugin for the placeholder.
|
|
||||||
* @param identifier The identifier of the placeholder.
|
|
||||||
* @param function A lambda to get the result of the placeholder.
|
|
||||||
* @param requiresPlayer If the placeholder requires a player.
|
|
||||||
*/
|
|
||||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
|
||||||
@NotNull final String identifier,
|
|
||||||
@NotNull final Function<Player, String> function,
|
|
||||||
final boolean requiresPlayer) {
|
|
||||||
this.plugin = plugin;
|
|
||||||
this.identifier = identifier;
|
|
||||||
this.function = function;
|
|
||||||
this.requiresPlayer = requiresPlayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the result of the placeholder with respect to a player.
|
|
||||||
*
|
|
||||||
* @param player The player to translate with respect to.
|
|
||||||
* @return The result of the placeholder.
|
|
||||||
*/
|
|
||||||
public String getResult(@Nullable final Player player) {
|
|
||||||
if (player == null) {
|
|
||||||
Validate.isTrue(!requiresPlayer, "null player passed to requiresPlayer placeholder.");
|
|
||||||
}
|
|
||||||
return this.function.apply(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get if the placeholder requires a player to get a result.
|
|
||||||
*
|
|
||||||
* @return If the placeholder requires a player.
|
|
||||||
*/
|
|
||||||
public boolean requiresPlayer() {
|
|
||||||
return requiresPlayer;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the identifier.
|
|
||||||
*
|
|
||||||
* @return The identifier.
|
|
||||||
*/
|
|
||||||
public String getIdentifier() {
|
|
||||||
return identifier;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the plugin.
|
|
||||||
*
|
|
||||||
* @return The plugin.
|
|
||||||
*/
|
|
||||||
@Nullable
|
|
||||||
public EcoPlugin getPlugin() {
|
|
||||||
return plugin;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Register the placeholder.
|
|
||||||
*/
|
|
||||||
public void register() {
|
|
||||||
PlaceholderManager.registerPlaceholder(this.toModernPlaceholder());
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convert the placeholder to a modern placeholder.
|
|
||||||
*
|
|
||||||
* @return The placeholder.
|
|
||||||
*/
|
|
||||||
Placeholder toModernPlaceholder() {
|
|
||||||
if (this.requiresPlayer) {
|
|
||||||
return new PlayerPlaceholder(
|
|
||||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
|
||||||
identifier,
|
|
||||||
function
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return new PlayerlessPlaceholder(
|
|
||||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
|
||||||
identifier,
|
|
||||||
() -> function.apply(null)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean equals(@Nullable final Object o) {
|
|
||||||
if (this == o) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
if (!(o instanceof PlaceholderEntry entry)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return Objects.equals(this.getIdentifier(), entry.getIdentifier())
|
|
||||||
&& Objects.equals(this.getPlugin(), entry.getPlugin());
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int hashCode() {
|
|
||||||
return Objects.hash(this.getIdentifier(), this.getPlugin());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +1,21 @@
|
|||||||
package com.willfp.eco.core.integrations.placeholder;
|
package com.willfp.eco.core.integrations.placeholder;
|
||||||
|
|
||||||
|
import com.github.benmanes.caffeine.cache.Cache;
|
||||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||||
import com.willfp.eco.core.Eco;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||||
|
import com.willfp.eco.core.placeholder.DynamicPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
import com.willfp.eco.core.placeholder.InjectablePlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.Placeholder;
|
import com.willfp.eco.core.placeholder.Placeholder;
|
||||||
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
import com.willfp.eco.core.placeholder.PlaceholderInjectable;
|
||||||
|
import com.willfp.eco.core.placeholder.PlayerDynamicPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
@@ -24,6 +27,7 @@ import java.util.HashMap;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
@@ -32,18 +36,24 @@ import java.util.regex.Pattern;
|
|||||||
/**
|
/**
|
||||||
* Class to handle placeholder integrations.
|
* Class to handle placeholder integrations.
|
||||||
*/
|
*/
|
||||||
@SuppressWarnings("removal")
|
|
||||||
public final class PlaceholderManager {
|
public final class PlaceholderManager {
|
||||||
/**
|
/**
|
||||||
* All registered placeholders.
|
* All registered placeholders.
|
||||||
*/
|
*/
|
||||||
private static final Map<EcoPlugin, Map<String, Placeholder>> REGISTERED_PLACEHOLDERS = new HashMap<>();
|
private static final Map<EcoPlugin, Map<Pattern, Placeholder>> REGISTERED_PLACEHOLDERS = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* All registered placeholder integrations.
|
* All registered placeholder integrations.
|
||||||
*/
|
*/
|
||||||
private static final Set<PlaceholderIntegration> REGISTERED_INTEGRATIONS = new HashSet<>();
|
private static final Set<PlaceholderIntegration> REGISTERED_INTEGRATIONS = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Placeholder Lookup Cache.
|
||||||
|
*/
|
||||||
|
private static final Cache<PlaceholderLookup, Optional<Placeholder>> PLACEHOLDER_LOOKUP_CACHE = Caffeine.newBuilder()
|
||||||
|
.expireAfterWrite(1, TimeUnit.SECONDS)
|
||||||
|
.build();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Placeholder Cache.
|
* Placeholder Cache.
|
||||||
*/
|
*/
|
||||||
@@ -51,15 +61,27 @@ public final class PlaceholderManager {
|
|||||||
.expireAfterWrite(50, TimeUnit.MILLISECONDS)
|
.expireAfterWrite(50, TimeUnit.MILLISECONDS)
|
||||||
.build(key -> key.entry.getValue(key.player));
|
.build(key -> key.entry.getValue(key.player));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Dynamic Placeholder Cache.
|
||||||
|
*/
|
||||||
|
private static final LoadingCache<DynamicEntryWithPlayer, String> DYNAMIC_PLACEHOLDER_CACHE = Caffeine.newBuilder()
|
||||||
|
.expireAfterWrite(50, TimeUnit.MILLISECONDS)
|
||||||
|
.build(key -> key.entry.getValue(key.args, key.player));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The default PlaceholderAPI pattern; brought in for compatibility.
|
* The default PlaceholderAPI pattern; brought in for compatibility.
|
||||||
*/
|
*/
|
||||||
private static final Pattern PATTERN = Pattern.compile("[%]([^% ]+)[%]");
|
private static final Pattern PATTERN = Pattern.compile("%([^% ]+)%");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Empty injectable object.
|
* Empty injectable object.
|
||||||
*/
|
*/
|
||||||
public static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
public static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
||||||
|
@Override
|
||||||
|
public void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||||
|
// Do nothing.
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clearInjectedPlaceholders() {
|
public void clearInjectedPlaceholders() {
|
||||||
// Do nothing.
|
// Do nothing.
|
||||||
@@ -88,26 +110,16 @@ public final class PlaceholderManager {
|
|||||||
* @param placeholder The placeholder to register.
|
* @param placeholder The placeholder to register.
|
||||||
*/
|
*/
|
||||||
public static void registerPlaceholder(@NotNull final Placeholder placeholder) {
|
public static void registerPlaceholder(@NotNull final Placeholder placeholder) {
|
||||||
if (placeholder instanceof StaticPlaceholder) {
|
if (placeholder instanceof StaticPlaceholder || placeholder instanceof PlayerStaticPlaceholder) {
|
||||||
throw new IllegalArgumentException("Static placeholders cannot be registered!");
|
throw new IllegalArgumentException("Static placeholders cannot be registered!");
|
||||||
}
|
}
|
||||||
|
|
||||||
EcoPlugin plugin = placeholder.getPlugin() == null ? Eco.get().getEcoPlugin() : placeholder.getPlugin();
|
Map<Pattern, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
||||||
Map<String, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
.getOrDefault(placeholder.getPlugin(), new HashMap<>());
|
||||||
.getOrDefault(plugin, new HashMap<>());
|
|
||||||
pluginPlaceholders.put(placeholder.getIdentifier(), placeholder);
|
|
||||||
REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
pluginPlaceholders.put(placeholder.getPattern(), placeholder);
|
||||||
* Register a placeholder.
|
|
||||||
*
|
REGISTERED_PLACEHOLDERS.put(placeholder.getPlugin(), pluginPlaceholders);
|
||||||
* @param placeholder The placeholder to register.
|
|
||||||
* @deprecated Uses old placeholder system.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
|
||||||
public static void registerPlaceholder(@NotNull final PlaceholderEntry placeholder) {
|
|
||||||
registerPlaceholder(placeholder.toModernPlaceholder());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -118,10 +130,11 @@ public final class PlaceholderManager {
|
|||||||
* @return The value of the placeholder.
|
* @return The value of the placeholder.
|
||||||
* @deprecated Specify a plugin to get the result from.
|
* @deprecated Specify a plugin to get the result from.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated(since = "6.52.2", forRemoval = true)
|
||||||
|
@SuppressWarnings("unused")
|
||||||
public static String getResult(@Nullable final Player player,
|
public static String getResult(@Nullable final Player player,
|
||||||
@NotNull final String identifier) {
|
@NotNull final String identifier) {
|
||||||
return getResult(player, identifier, null);
|
throw new UnsupportedOperationException("Please specify a plugin to get the result from!");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -135,22 +148,35 @@ public final class PlaceholderManager {
|
|||||||
@NotNull
|
@NotNull
|
||||||
public static String getResult(@Nullable final Player player,
|
public static String getResult(@Nullable final Player player,
|
||||||
@NotNull final String identifier,
|
@NotNull final String identifier,
|
||||||
@Nullable final EcoPlugin plugin) {
|
@NotNull final EcoPlugin plugin) {
|
||||||
EcoPlugin owner = plugin == null ? Eco.get().getEcoPlugin() : plugin;
|
Validate.notNull(plugin, "Plugin cannot be null!");
|
||||||
Placeholder placeholder = REGISTERED_PLACEHOLDERS.getOrDefault(owner, new HashMap<>()).get(identifier.toLowerCase());
|
|
||||||
|
|
||||||
if (placeholder == null && plugin != null) {
|
// This is really janky, and it sucks, but it works so?
|
||||||
Placeholder alternate = REGISTERED_PLACEHOLDERS.getOrDefault(Eco.get().getEcoPlugin(), new HashMap<>())
|
// Compensating for regex being slow so that's why we get it.
|
||||||
.get(identifier.toLowerCase());
|
Placeholder placeholder = PLACEHOLDER_LOOKUP_CACHE.get(
|
||||||
if (alternate != null) {
|
new PlaceholderLookup(identifier, plugin),
|
||||||
placeholder = alternate;
|
(it) -> {
|
||||||
}
|
// I hate the streams API.
|
||||||
}
|
return REGISTERED_PLACEHOLDERS
|
||||||
|
.getOrDefault(plugin, new HashMap<>())
|
||||||
|
.entrySet()
|
||||||
|
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
||||||
|
.map(Map.Entry::getValue)
|
||||||
|
.findFirst();
|
||||||
|
}
|
||||||
|
).orElse(null);
|
||||||
|
|
||||||
if (placeholder == null) {
|
if (placeholder == null) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
This code here is *really* not very good. It's mega externalized logic hacked
|
||||||
|
together and made worse by the addition of dynamic placeholders. But it works,
|
||||||
|
and it means I don't have to rewrite the whole placeholder system. So it's
|
||||||
|
good enough for me.
|
||||||
|
*/
|
||||||
|
|
||||||
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
|
if (placeholder instanceof PlayerPlaceholder playerPlaceholder) {
|
||||||
if (player == null) {
|
if (player == null) {
|
||||||
return "";
|
return "";
|
||||||
@@ -159,6 +185,14 @@ public final class PlaceholderManager {
|
|||||||
}
|
}
|
||||||
} else if (placeholder instanceof PlayerlessPlaceholder playerlessPlaceholder) {
|
} else if (placeholder instanceof PlayerlessPlaceholder playerlessPlaceholder) {
|
||||||
return playerlessPlaceholder.getValue();
|
return playerlessPlaceholder.getValue();
|
||||||
|
} else if (placeholder instanceof PlayerDynamicPlaceholder playerDynamicPlaceholder) {
|
||||||
|
if (player == null) {
|
||||||
|
return "";
|
||||||
|
} else {
|
||||||
|
return DYNAMIC_PLACEHOLDER_CACHE.get(new DynamicEntryWithPlayer(playerDynamicPlaceholder, identifier, player));
|
||||||
|
}
|
||||||
|
} else if (placeholder instanceof DynamicPlaceholder dynamicPlaceholder) {
|
||||||
|
return dynamicPlaceholder.getValue(identifier);
|
||||||
} else {
|
} else {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
@@ -176,22 +210,6 @@ public final class PlaceholderManager {
|
|||||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Translate all placeholders with respect to a player.
|
|
||||||
*
|
|
||||||
* @param text The text that may contain placeholders to translate.
|
|
||||||
* @param player The player to translate the placeholders with respect to.
|
|
||||||
* @param statics Extra static placeholders.
|
|
||||||
* @return The text, translated.
|
|
||||||
* @deprecated Use new static system.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public static String translatePlaceholders(@NotNull final String text,
|
|
||||||
@Nullable final Player player,
|
|
||||||
@NotNull final List<StaticPlaceholder> statics) {
|
|
||||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Translate all placeholders with respect to a player.
|
* Translate all placeholders with respect to a player.
|
||||||
*
|
*
|
||||||
@@ -221,6 +239,35 @@ public final class PlaceholderManager {
|
|||||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||||
String processed = text;
|
String processed = text;
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
Why am I doing statics at the start, but player statics at the end?
|
||||||
|
|
||||||
|
Additional players let you use something like victim as a player to parse in relation to,
|
||||||
|
for example doing %victim_player_health%, which would parse the health of the victim.
|
||||||
|
|
||||||
|
However, something like libreforge will also inject %victim_max_health%, which is unrelated
|
||||||
|
to additional players, and instead holds a constant value. So, eco saw this, smartly thought
|
||||||
|
"ah, it's an additional player, let's parse it", and then tried to parse %max_health% with
|
||||||
|
relation to the victim, which resolved to zero. So, we have to parse statics and player statics
|
||||||
|
that might include a prefix first, then additional players, then player statics with the support
|
||||||
|
of additional players.
|
||||||
|
|
||||||
|
This was a massive headache and took so many reports before I clocked what was going on.
|
||||||
|
|
||||||
|
Oh well, at least it's fixed now.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||||
|
if (injection instanceof StaticPlaceholder placeholder) {
|
||||||
|
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
||||||
|
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||||
|
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Prevent running 2 scans if there are no additional players.
|
// Prevent running 2 scans if there are no additional players.
|
||||||
if (!additionalPlayers.isEmpty()) {
|
if (!additionalPlayers.isEmpty()) {
|
||||||
List<String> found = findPlaceholdersIn(text);
|
List<String> found = findPlaceholdersIn(text);
|
||||||
@@ -242,17 +289,23 @@ public final class PlaceholderManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Only run jank code if there are no integrations.
|
||||||
|
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||||
|
processed = setWithoutIntegration(processed, player);
|
||||||
|
}
|
||||||
|
|
||||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||||
processed = integration.translate(processed, player);
|
processed = integration.translate(processed, player);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// DON'T REMOVE THIS, IT'S NOT DUPLICATE CODE.
|
||||||
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||||
// Do I know this is a bad way of doing this? Yes.
|
// Do I know this is a bad way of doing this? Yes.
|
||||||
if (injection instanceof StaticPlaceholder placeholder) {
|
if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
|
||||||
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
|
||||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return processed;
|
return processed;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -265,12 +318,9 @@ public final class PlaceholderManager {
|
|||||||
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||||
Set<String> found = new HashSet<>();
|
Set<String> found = new HashSet<>();
|
||||||
|
|
||||||
// Mock PAPI for those without it installed
|
Matcher matcher = PATTERN.matcher(text);
|
||||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
while (matcher.find()) {
|
||||||
Matcher matcher = PATTERN.matcher(text);
|
found.add(matcher.group());
|
||||||
while (matcher.find()) {
|
|
||||||
found.add(matcher.group());
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||||
@@ -280,11 +330,111 @@ public final class PlaceholderManager {
|
|||||||
return new ArrayList<>(found);
|
return new ArrayList<>(found);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set placeholders without any integrations.
|
||||||
|
* <p>
|
||||||
|
* This is fallback if for some reason you don't have PAPI installed.
|
||||||
|
* It's a cut-down version of the actual PAPI code, and I don't
|
||||||
|
* really know how it works.
|
||||||
|
* <p>
|
||||||
|
* Original source
|
||||||
|
* <a href="https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java">here</a>.
|
||||||
|
*
|
||||||
|
* @param text The text.
|
||||||
|
* @param player The player.
|
||||||
|
* @return The text.
|
||||||
|
*/
|
||||||
|
private static String setWithoutIntegration(@NotNull final String text,
|
||||||
|
@Nullable final Player player) {
|
||||||
|
char[] chars = text.toCharArray();
|
||||||
|
StringBuilder builder = new StringBuilder(text.length());
|
||||||
|
StringBuilder identifier = new StringBuilder();
|
||||||
|
StringBuilder parameters = new StringBuilder();
|
||||||
|
|
||||||
|
for (int i = 0; i < chars.length; i++) {
|
||||||
|
char currentChar = chars[i];
|
||||||
|
if (currentChar == '%' && i + 1 < chars.length) {
|
||||||
|
boolean identified = false;
|
||||||
|
boolean badPlaceholder = true;
|
||||||
|
boolean hadSpace = false;
|
||||||
|
|
||||||
|
while (true) {
|
||||||
|
i++;
|
||||||
|
if (i >= chars.length) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
char p = chars[i];
|
||||||
|
if (p == ' ' && !identified) {
|
||||||
|
hadSpace = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == '%') {
|
||||||
|
badPlaceholder = false;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (p == '_' && !identified) {
|
||||||
|
identified = true;
|
||||||
|
} else if (identified) {
|
||||||
|
parameters.append(p);
|
||||||
|
} else {
|
||||||
|
identifier.append(p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
String pluginName = identifier.toString().toLowerCase();
|
||||||
|
EcoPlugin plugin = EcoPlugin.getPlugin(pluginName);
|
||||||
|
String placeholderIdentifier = parameters.toString();
|
||||||
|
identifier.setLength(0);
|
||||||
|
parameters.setLength(0);
|
||||||
|
if (badPlaceholder) {
|
||||||
|
builder.append('%').append(pluginName);
|
||||||
|
if (identified) {
|
||||||
|
builder.append('_').append(placeholderIdentifier);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hadSpace) {
|
||||||
|
builder.append(' ');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (plugin == null) {
|
||||||
|
builder.append('%').append(pluginName);
|
||||||
|
|
||||||
|
if (identified) {
|
||||||
|
builder.append('_');
|
||||||
|
}
|
||||||
|
|
||||||
|
builder.append(placeholderIdentifier).append('%');
|
||||||
|
} else {
|
||||||
|
builder.append(getResult(player, placeholderIdentifier, plugin));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
builder.append(currentChar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private record PlaceholderLookup(@NotNull String identifier,
|
||||||
|
@Nullable EcoPlugin plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private record EntryWithPlayer(@NotNull PlayerPlaceholder entry,
|
private record EntryWithPlayer(@NotNull PlayerPlaceholder entry,
|
||||||
@NotNull Player player) {
|
@NotNull Player player) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private record DynamicEntryWithPlayer(@NotNull PlayerDynamicPlaceholder entry,
|
||||||
|
@NotNull String args,
|
||||||
|
@NotNull Player player) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
private PlaceholderManager() {
|
private PlaceholderManager() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
package com.willfp.eco.core.integrations.shop;
|
package com.willfp.eco.core.integrations.shop;
|
||||||
|
|
||||||
import com.willfp.eco.core.integrations.Integration;
|
import com.willfp.eco.core.integrations.Integration;
|
||||||
|
import com.willfp.eco.core.price.Price;
|
||||||
|
import com.willfp.eco.core.price.impl.PriceFree;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@@ -29,12 +31,41 @@ public interface ShopIntegration extends Integration {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if an item is sellable for a player.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param player The player.
|
||||||
|
* @return If sellable.
|
||||||
|
*/
|
||||||
|
default boolean isSellable(@NotNull final ItemStack itemStack,
|
||||||
|
@NotNull final Player player) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of one of an item for a player.
|
||||||
|
* <p>
|
||||||
|
* For example, if you pass in a stack, it will only return the value of <b>one</b> item, not the full stack.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param player The player.
|
||||||
|
* @return The price.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
default Price getUnitValue(@NotNull final ItemStack itemStack,
|
||||||
|
@NotNull final Player player) {
|
||||||
|
return new PriceFree();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the price of an item.
|
* Get the price of an item.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The price.
|
* @return The price.
|
||||||
|
* @deprecated Use getValue instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
default double getPrice(@NotNull final ItemStack itemStack) {
|
default double getPrice(@NotNull final ItemStack itemStack) {
|
||||||
// Do nothing unless overridden.
|
// Do nothing unless overridden.
|
||||||
return 0.0;
|
return 0.0;
|
||||||
@@ -46,9 +77,11 @@ public interface ShopIntegration extends Integration {
|
|||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
* @return The price.
|
* @return The price.
|
||||||
|
* @deprecated Use getValue instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
default double getPrice(@NotNull final ItemStack itemStack,
|
default double getPrice(@NotNull final ItemStack itemStack,
|
||||||
@NotNull final Player player) {
|
@NotNull final Player player) {
|
||||||
return getPrice(itemStack);
|
return getUnitValue(itemStack, player).getValue(player);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.willfp.eco.core.integrations.shop;
|
package com.willfp.eco.core.integrations.shop;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.price.Price;
|
||||||
|
import com.willfp.eco.core.price.impl.PriceFree;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
@@ -36,12 +38,57 @@ public final class ShopManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if an item is sellable for a player.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param player The player.
|
||||||
|
* @return If sellable.
|
||||||
|
*/
|
||||||
|
public static boolean isSellable(@Nullable final ItemStack itemStack,
|
||||||
|
@NotNull final Player player) {
|
||||||
|
if (itemStack == null) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ShopIntegration integration : REGISTERED) {
|
||||||
|
return integration.isSellable(itemStack, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of one of an item for a player.
|
||||||
|
* <p>
|
||||||
|
* For example, if you pass in a stack, it will only return the value of <b>one</b> item, not the full stack.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param player The player.
|
||||||
|
* @return The price.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
public static Price getUnitValue(@Nullable final ItemStack itemStack,
|
||||||
|
@NotNull final Player player) {
|
||||||
|
if (itemStack == null) {
|
||||||
|
return new PriceFree();
|
||||||
|
}
|
||||||
|
|
||||||
|
for (ShopIntegration integration : REGISTERED) {
|
||||||
|
return integration.getUnitValue(itemStack, player);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PriceFree();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the price of an item.
|
* Get the price of an item.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The price.
|
* @return The price.
|
||||||
|
* @deprecated Use getValue instead. This will always return 0 as prices depend on players.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
public static double getItemPrice(@Nullable final ItemStack itemStack) {
|
public static double getItemPrice(@Nullable final ItemStack itemStack) {
|
||||||
return getItemPrice(itemStack, null);
|
return getItemPrice(itemStack, null);
|
||||||
}
|
}
|
||||||
@@ -52,19 +99,17 @@ public final class ShopManager {
|
|||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
* @return The price.
|
* @return The price.
|
||||||
|
* @deprecated Use getValue instead. Null players / null items will always return 0.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
public static double getItemPrice(@Nullable final ItemStack itemStack,
|
public static double getItemPrice(@Nullable final ItemStack itemStack,
|
||||||
@Nullable final Player player) {
|
@Nullable final Player player) {
|
||||||
if (itemStack == null) {
|
if (itemStack == null || player == null) {
|
||||||
return 0.0;
|
return 0.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (ShopIntegration shopIntegration : REGISTERED) {
|
for (ShopIntegration shopIntegration : REGISTERED) {
|
||||||
if (player == null) {
|
return shopIntegration.getUnitValue(itemStack, player).getValue(player, itemStack.getAmount());
|
||||||
return shopIntegration.getPrice(itemStack);
|
|
||||||
} else {
|
|
||||||
return shopIntegration.getPrice(itemStack, player);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0.0;
|
return 0.0;
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
package com.willfp.eco.core.integrations.shop;
|
package com.willfp.eco.core.integrations.shop;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.price.Price;
|
||||||
|
import com.willfp.eco.core.price.impl.PriceEconomy;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.event.player.PlayerEvent;
|
import org.bukkit.event.player.PlayerEvent;
|
||||||
@@ -19,7 +21,12 @@ public class ShopSellEvent extends PlayerEvent {
|
|||||||
/**
|
/**
|
||||||
* The sell price.
|
* The sell price.
|
||||||
*/
|
*/
|
||||||
private double price;
|
private Price price;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The price multiplier.
|
||||||
|
*/
|
||||||
|
private double multiplier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The item to be sold.
|
* The item to be sold.
|
||||||
@@ -33,31 +40,64 @@ public class ShopSellEvent extends PlayerEvent {
|
|||||||
* @param who The player.
|
* @param who The player.
|
||||||
* @param price The price.
|
* @param price The price.
|
||||||
* @param item The item.
|
* @param item The item.
|
||||||
|
* @deprecated Use the price system instead.
|
||||||
*/
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
public ShopSellEvent(@NotNull final Player who,
|
public ShopSellEvent(@NotNull final Player who,
|
||||||
final double price,
|
final double price,
|
||||||
@Nullable final ItemStack item) {
|
@Nullable final ItemStack item) {
|
||||||
|
this(who, new PriceEconomy(price), item);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new shop sell event.
|
||||||
|
*
|
||||||
|
* @param who The player.
|
||||||
|
* @param price The price.
|
||||||
|
* @param item The item.
|
||||||
|
*/
|
||||||
|
public ShopSellEvent(@NotNull final Player who,
|
||||||
|
@NotNull final Price price,
|
||||||
|
@Nullable final ItemStack item) {
|
||||||
|
this(who, price, item, 1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new shop sell event.
|
||||||
|
*
|
||||||
|
* @param who The player.
|
||||||
|
* @param price The price.
|
||||||
|
* @param item The item.
|
||||||
|
* @param multiplier The multiplier.
|
||||||
|
*/
|
||||||
|
public ShopSellEvent(@NotNull final Player who,
|
||||||
|
@NotNull final Price price,
|
||||||
|
@Nullable final ItemStack item,
|
||||||
|
final double multiplier) {
|
||||||
super(who);
|
super(who);
|
||||||
|
|
||||||
this.price = price;
|
this.price = price;
|
||||||
this.item = item;
|
this.item = item;
|
||||||
|
|
||||||
|
this.multiplier = multiplier;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the price.
|
* Get the value.
|
||||||
*
|
*
|
||||||
* @return The price.
|
* @return The value.
|
||||||
*/
|
*/
|
||||||
public double getPrice() {
|
@NotNull
|
||||||
|
public Price getValue() {
|
||||||
return this.price;
|
return this.price;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set the price.
|
* Set the value.
|
||||||
*
|
*
|
||||||
* @param price The price.
|
* @param price The value.
|
||||||
*/
|
*/
|
||||||
public void setPrice(final double price) {
|
public void setValue(@NotNull final Price price) {
|
||||||
this.price = price;
|
this.price = price;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,6 +121,46 @@ public class ShopSellEvent extends PlayerEvent {
|
|||||||
return item != null;
|
return item != null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the price multiplier.
|
||||||
|
*
|
||||||
|
* @return The multiplier.
|
||||||
|
*/
|
||||||
|
public double getMultiplier() {
|
||||||
|
return multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the price multiplier.
|
||||||
|
*
|
||||||
|
* @param multiplier The multiplier.
|
||||||
|
*/
|
||||||
|
public void setMultiplier(final double multiplier) {
|
||||||
|
this.multiplier = multiplier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the price.
|
||||||
|
*
|
||||||
|
* @return The price.
|
||||||
|
* @deprecated Use the price system instead.
|
||||||
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
|
public double getPrice() {
|
||||||
|
return this.getValue().getValue(player);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the price.
|
||||||
|
*
|
||||||
|
* @param price The price.
|
||||||
|
* @deprecated Use the price system instead.
|
||||||
|
*/
|
||||||
|
@Deprecated(since = "6.47.0", forRemoval = true)
|
||||||
|
public void setPrice(final double price) {
|
||||||
|
this.setValue(new PriceEconomy(price));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Bukkit parity.
|
* Bukkit parity.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.integrations.shop;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Wrapper class for shop integrations.
|
|
||||||
*
|
|
||||||
* @deprecated Use ShopIntegration instead.
|
|
||||||
*/
|
|
||||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
|
||||||
public interface ShopWrapper extends ShopIntegration {
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -568,6 +568,42 @@ public final class Items {
|
|||||||
return EMPTY_TESTABLE_ITEM.matches(itemStack);
|
return EMPTY_TESTABLE_ITEM.matches(itemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if an item matches any items.
|
||||||
|
*
|
||||||
|
* @param itemStack The item.
|
||||||
|
* @param items The items.
|
||||||
|
* @return If matches any.
|
||||||
|
*/
|
||||||
|
public static boolean matchesAny(@Nullable final ItemStack itemStack,
|
||||||
|
@NotNull final Collection<TestableItem> items) {
|
||||||
|
for (TestableItem item : items) {
|
||||||
|
if (item.matches(itemStack)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get if any item matches any item.
|
||||||
|
*
|
||||||
|
* @param itemStacks The items.
|
||||||
|
* @param items The items.
|
||||||
|
* @return If matches any.
|
||||||
|
*/
|
||||||
|
public static boolean matchesAny(@NotNull final Collection<ItemStack> itemStacks,
|
||||||
|
@NotNull final Collection<TestableItem> items) {
|
||||||
|
for (ItemStack itemStack : itemStacks) {
|
||||||
|
if (matchesAny(itemStack, items)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
private Items() {
|
private Items() {
|
||||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -70,7 +70,7 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public U setAmount(final int amount) {
|
public U setAmount(final int amount) {
|
||||||
Validate.isTrue(amount >= 1 && amount <= base.getMaxStackSize());
|
Validate.isTrue(amount >= 1);
|
||||||
base.setAmount(amount);
|
base.setAmount(amount);
|
||||||
return (U) this;
|
return (U) this;
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user