Compare commits
128 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8cda5be2f0 | ||
|
|
850bf5d642 | ||
|
|
af197db70a | ||
|
|
c11fedff4e | ||
|
|
4001af9b8c | ||
|
|
69a8acf39a | ||
|
|
7247b95cbe | ||
|
|
4b5657de91 | ||
|
|
11ab52be94 | ||
|
|
d47757cca4 | ||
|
|
411753859c | ||
|
|
bb188e5812 | ||
|
|
a1a477e7df | ||
|
|
3144c3a954 | ||
|
|
75412b98a4 | ||
|
|
3f7f1946dc | ||
|
|
d40fa7983d | ||
|
|
c7a7a8c48a | ||
|
|
cfd5cc4be2 | ||
|
|
c1e36eb2bc | ||
|
|
d6d6da520a | ||
|
|
b2fd23b13a | ||
|
|
d6e4346e4f | ||
|
|
b4e5735c51 | ||
|
|
ba8f861901 | ||
|
|
a40415a76f | ||
|
|
d85a7a4503 | ||
|
|
cab3cb9a9f | ||
|
|
9fb106c4de | ||
|
|
cce8e46634 | ||
|
|
bb595e340c | ||
|
|
b40c3a41c2 | ||
|
|
226ad14ede | ||
|
|
eadbb489a7 | ||
|
|
fb900a18ad | ||
|
|
395a5e1745 | ||
|
|
eeffa33918 | ||
|
|
617a91c41c | ||
|
|
fbfe11d275 | ||
|
|
a4e31ff5ca | ||
|
|
bf85785451 | ||
|
|
d830672795 | ||
|
|
255bb4b38e | ||
|
|
d73c665d20 | ||
|
|
39b95c7a34 | ||
|
|
bbcbc7f88b | ||
|
|
4787d0f389 | ||
|
|
641d479c6d | ||
|
|
a521a9c93a | ||
|
|
51f690c9cb | ||
|
|
a451732c1e | ||
|
|
d6d0e4d3b3 | ||
|
|
e6bdf192ed | ||
|
|
eccd4b4a6f | ||
|
|
8650e9bb2a | ||
|
|
8e5392084d | ||
|
|
5c39a557f2 | ||
|
|
75d13fafc1 | ||
|
|
c674518eb8 | ||
|
|
23e18cd0dd | ||
|
|
2644495bca | ||
|
|
130094a16e | ||
|
|
6c4bb2e6e8 | ||
|
|
c56d5d38c3 | ||
|
|
f0d44ccf02 | ||
|
|
83f9c27238 | ||
|
|
083f643ce2 | ||
|
|
76e808b8b1 | ||
|
|
beca53ca6a | ||
|
|
028c7c76da | ||
|
|
0e02e8f6db | ||
|
|
94984d993b | ||
|
|
741208d20c | ||
|
|
b92c55d3e7 | ||
|
|
b60fc49fd5 | ||
|
|
9fc5b78fa0 | ||
|
|
91ba7cc475 | ||
|
|
45fc05ca49 | ||
|
|
610081dab4 | ||
|
|
22c62e45be | ||
|
|
119b5742fb | ||
|
|
c143006c4b | ||
|
|
f88c9b7d42 | ||
|
|
775c562705 | ||
|
|
9b443f25cc | ||
|
|
ddeaa5c79c | ||
|
|
78093531f7 | ||
|
|
5ec293e9c9 | ||
|
|
d846f348ac | ||
|
|
30ce422349 | ||
|
|
9275b22f72 | ||
|
|
cc8392afd1 | ||
|
|
726f4a44c4 | ||
|
|
eafae209a6 | ||
|
|
04c450b46a | ||
|
|
d4e1f58f2a | ||
|
|
b0806b934b | ||
|
|
a21ecfbdde | ||
|
|
f3a6861bc6 | ||
|
|
eaa295e6a3 | ||
|
|
399387eca1 | ||
|
|
272f551aae | ||
|
|
d8c5fc0959 | ||
|
|
d1ca106d01 | ||
|
|
99f5174e28 | ||
|
|
d9f4aee384 | ||
|
|
c2aae8c2eb | ||
|
|
52061b7b51 | ||
|
|
762969c172 | ||
|
|
62d5cf885f | ||
|
|
1e70a9fdea | ||
|
|
ec8a65b4f8 | ||
|
|
a163219372 | ||
|
|
4d6e097f8f | ||
|
|
497adbe7b1 | ||
|
|
78907412b2 | ||
|
|
d6bec5d88b | ||
|
|
aab1f31ca0 | ||
|
|
5ea586eaae | ||
|
|
2ffc293211 | ||
|
|
88bedef420 | ||
|
|
dac5ffce9a | ||
|
|
d641adadea | ||
|
|
46269354c6 | ||
|
|
2d93465d1d | ||
|
|
484d4dde75 | ||
|
|
5e9a408704 | ||
|
|
f1b113f435 |
38
.github/workflows/publish-release.yml
vendored
Normal file
38
.github/workflows/publish-release.yml
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
name: Publish release
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [published]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish-release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout latest code
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Set up JDK 16
|
||||||
|
uses: actions/setup-java@v2
|
||||||
|
with:
|
||||||
|
distribution: 'adopt'
|
||||||
|
java-version: 16
|
||||||
|
|
||||||
|
- name: Setup build cache
|
||||||
|
uses: actions/cache@v2.1.6
|
||||||
|
with:
|
||||||
|
path: ~/.gradle/caches
|
||||||
|
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
|
||||||
|
restore-keys: |
|
||||||
|
${{ runner.os }}-gradle-
|
||||||
|
- name: Publish artifact
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
||||||
|
# The GITHUB_REF tag comes in the format 'refs/tags/xxx'.
|
||||||
|
# So if we split on '/' and take the 3rd value, we can get the release name.
|
||||||
|
run: |
|
||||||
|
NEW_VERSION=$(echo "${GITHUB_REF}" | cut -d "/" -f3)
|
||||||
|
echo "New version: ${NEW_VERSION}"
|
||||||
|
echo "Github username: ${GITHUB_ACTOR}"
|
||||||
|
./gradlew -Pversion=${NEW_VERSION} publish
|
||||||
@@ -6,7 +6,7 @@
|
|||||||
- Every method and field must have a javadoc attached.
|
- Every method and field must have a javadoc attached.
|
||||||
|
|
||||||
2. Use lombok wherever possible.
|
2. Use lombok wherever possible.
|
||||||
- @Getter, @Setter, @ToString, @EqualsAndHashCode, @UtilityClass are the most important.
|
- @Getter, @Setter, @UtilityClass only.
|
||||||
|
|
||||||
3. Use JetBrains annotations
|
3. Use JetBrains annotations
|
||||||
- Every parameter should be annotated with @NotNull or @Nullable
|
- Every parameter should be annotated with @NotNull or @Nullable
|
||||||
@@ -24,4 +24,4 @@
|
|||||||
|
|
||||||
## Other
|
## Other
|
||||||
- All drops **must** be sent through a DropQueue - calls to World#dropItem will get your PR rejected.
|
- All drops **must** be sent through a DropQueue - calls to World#dropItem will get your PR rejected.
|
||||||
- eco is built with java 8. Usage of J9+ will get your PR rejected.
|
- eco is built with java 16.
|
||||||
161
README.md
161
README.md
@@ -1 +1,160 @@
|
|||||||
## eco - Library for spigot plugin development.
|
<h1 align="center">
|
||||||
|
<br>
|
||||||
|
<img src="https://i.imgur.com/p5uR2Qp.png" alt="eco logo" width="256">
|
||||||
|
<br>
|
||||||
|
</h1>
|
||||||
|
|
||||||
|
<h4 align="center">eco - Simplify spigot development.</h4>
|
||||||
|
|
||||||
|
### Plugin Information
|
||||||
|
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
|
||||||
|
- Supports 1.16.5+
|
||||||
|
|
||||||
|
### bStats
|
||||||
|
<img src="https://bstats.org/signatures/bukkit/eco.svg" width="512">
|
||||||
|
|
||||||
|
# Information for development
|
||||||
|
|
||||||
|
eco is a standalone plugin, so you will need to install it on any servers that have plugins which depend on it,
|
||||||
|
and specify it as a dependency in your plugin.yml:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
depend:
|
||||||
|
- eco
|
||||||
|
```
|
||||||
|
|
||||||
|
eco is available from any of these places:
|
||||||
|
|
||||||
|
- [GitHub](https://github.com/Auxilor/eco/releases)
|
||||||
|
- [Spigot](https://www.spigotmc.org/resources/eco.87955/)
|
||||||
|
- [Polymart](https://polymart.org/resource/eco.773)
|
||||||
|
- [Build it locally](https://github.com/Auxilor/eco#build-locally).
|
||||||
|
|
||||||
|
## Get from JitPack:
|
||||||
|
|
||||||
|
Gradle:
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
repositories {
|
||||||
|
maven { url 'https://jitpack.io' }
|
||||||
|
}
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
```groovy
|
||||||
|
dependencies {
|
||||||
|
compileOnly 'com.willfp:eco:Tag'
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `Tag` with a release tag for eco, eg `6.0.0`.
|
||||||
|
|
||||||
|
Maven:
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<repository>
|
||||||
|
<id>jitpack.io</id>
|
||||||
|
<url>https://jitpack.io</url>
|
||||||
|
</repository>
|
||||||
|
```
|
||||||
|
|
||||||
|
```xml
|
||||||
|
<dependency>
|
||||||
|
<groupId>com.willfp</groupId>
|
||||||
|
<artifactId>eco</artifactId>
|
||||||
|
<version>Tag</version>
|
||||||
|
<scope>provided</scope>
|
||||||
|
</dependency>
|
||||||
|
```
|
||||||
|
|
||||||
|
Replace `Tag` with a release tag for eco, eg `6.0.0`.
|
||||||
|
|
||||||
|
## Build locally:
|
||||||
|
|
||||||
|
Run the following commands in your terminal of choice.
|
||||||
|
|
||||||
|
If you're on windows, you will need to have git bash installed.
|
||||||
|
```
|
||||||
|
git clone https://github.com/Auxilor/eco
|
||||||
|
cd eco
|
||||||
|
./gradlew build
|
||||||
|
```
|
||||||
|
|
||||||
|
# Features
|
||||||
|
|
||||||
|
Here's a list of some (not all) of the features of eco:
|
||||||
|
|
||||||
|
- Command system with subcommands
|
||||||
|
- Reworked config system
|
||||||
|
- JSON Config Support
|
||||||
|
- Client-Side item display
|
||||||
|
- World drop system
|
||||||
|
- Event manager
|
||||||
|
- PlayerJumpEvent
|
||||||
|
- ArmorEquipEvent
|
||||||
|
- EntityDeathByEntityEvent
|
||||||
|
- NaturalExpGainEvent
|
||||||
|
- Plugin extensions (Plugins for plugins)
|
||||||
|
- GUI System
|
||||||
|
- Integration system for external plugins
|
||||||
|
- Anticheat support
|
||||||
|
- AAC
|
||||||
|
- Matrix
|
||||||
|
- NCP
|
||||||
|
- Spartan
|
||||||
|
- Vulcan
|
||||||
|
- Antigrief/Combat support
|
||||||
|
- CombatLogX (V10 + V11)
|
||||||
|
- FactionsUUID
|
||||||
|
- GriefPrevention
|
||||||
|
- Kingdoms
|
||||||
|
- Lands
|
||||||
|
- Towny
|
||||||
|
- WorldGuard
|
||||||
|
- mcMMO support
|
||||||
|
- Custom Items support
|
||||||
|
- Oraxen
|
||||||
|
- PlaceholderAPI support
|
||||||
|
- NMS Proxy / Wrapper system built in
|
||||||
|
- Custom Items system
|
||||||
|
- Crafting Recipe handler
|
||||||
|
- Tuples
|
||||||
|
- Support uploading to / downloading from hastebin
|
||||||
|
- Packet System (via ProtocolLib)
|
||||||
|
- Dependency Injection systems
|
||||||
|
- Prerequisite system
|
||||||
|
- API additions (via utility classes)
|
||||||
|
- Get bow from arrow
|
||||||
|
- Break a block as a player
|
||||||
|
- Get a vein of blocks
|
||||||
|
- Create 2D lists
|
||||||
|
- Create NamespacedKeys safely
|
||||||
|
- Random number, distribution, roman numerals
|
||||||
|
- Set skull texture
|
||||||
|
- Format all strings
|
||||||
|
- Hex Support
|
||||||
|
- Gradient Support
|
||||||
|
- Placeholder Support
|
||||||
|
- Get a scoreboard team from any color
|
||||||
|
- Telekinesis (Drops straight to inventory) system
|
||||||
|
- More vector options
|
||||||
|
- Update checker
|
||||||
|
- bStats integration
|
||||||
|
- Reworked systems for:
|
||||||
|
- NamespacedKey
|
||||||
|
- MetadataValue
|
||||||
|
- Runnables / Scheduling
|
||||||
|
|
||||||
|
... and a lot more!
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
*Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
|
||||||
|
|
||||||
|
<h1 align="center">
|
||||||
|
<br>
|
||||||
|
<a href="https://dedimc.promo/Auxilor" target="_blank">
|
||||||
|
<img src="https://i.imgur.com/zdDLhFA.png" alt="dedimc banner">
|
||||||
|
</a>
|
||||||
|
<br>
|
||||||
|
</h1>
|
||||||
@@ -68,6 +68,7 @@ allprojects {
|
|||||||
exclude group: "org.codehaus.plexus", module: "plexus-utils"
|
exclude group: "org.codehaus.plexus", module: "plexus-utils"
|
||||||
exclude group: "com.mojang", module: "brigadier"
|
exclude group: "com.mojang", module: "brigadier"
|
||||||
exclude group: "org.kitteh", module: "paste-gg-api"
|
exclude group: "org.kitteh", module: "paste-gg-api"
|
||||||
|
exclude group: "org.kitteh", module: "pastegg"
|
||||||
exclude group: "org.spongepowered", module: "configurate-hocon"
|
exclude group: "org.spongepowered", module: "configurate-hocon"
|
||||||
exclude group: "com.darkblade12", module: "particleeffect"
|
exclude group: "com.darkblade12", module: "particleeffect"
|
||||||
exclude group: "com.github.cryptomorin", module: "XSeries"
|
exclude group: "com.github.cryptomorin", module: "XSeries"
|
||||||
@@ -75,7 +76,6 @@ allprojects {
|
|||||||
|
|
||||||
shadowJar {
|
shadowJar {
|
||||||
relocate('org.bstats.bukkit', 'com.willfp.eco.shaded.bstats')
|
relocate('org.bstats.bukkit', 'com.willfp.eco.shaded.bstats')
|
||||||
relocate('org.apache.maven', 'com.willfp.eco.shaded.maven')
|
|
||||||
}
|
}
|
||||||
|
|
||||||
jar {
|
jar {
|
||||||
@@ -89,6 +89,7 @@ allprojects {
|
|||||||
java {
|
java {
|
||||||
sourceCompatibility = JavaVersion.VERSION_16
|
sourceCompatibility = JavaVersion.VERSION_16
|
||||||
targetCompatibility = JavaVersion.VERSION_16
|
targetCompatibility = JavaVersion.VERSION_16
|
||||||
|
withSourcesJar()
|
||||||
}
|
}
|
||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
|
|||||||
@@ -10,6 +10,8 @@
|
|||||||
<suppress files="[\\/]internal[\\/]" checks="JavadocVariable"/>
|
<suppress files="[\\/]internal[\\/]" checks="JavadocVariable"/>
|
||||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="MissingJavadocMethod"/>
|
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="MissingJavadocMethod"/>
|
||||||
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="JavadocVariable"/>
|
<suppress files="[\\/]eco[\\/]spigot[\\/]" checks="JavadocVariable"/>
|
||||||
|
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="MissingJavadocMethod"/>
|
||||||
|
<suppress files="[\\/]eco[\\/]proxy[\\/]" checks="JavadocVariable"/>
|
||||||
|
|
||||||
<!-- Modified version of library -->
|
<!-- Modified version of library -->
|
||||||
<suppress files="ArmorEquipEvent.java" checks="JavadocVariable"/>
|
<suppress files="ArmorEquipEvent.java" checks="JavadocVariable"/>
|
||||||
|
|||||||
@@ -6,14 +6,17 @@ group 'com.willfp'
|
|||||||
version rootProject.version
|
version rootProject.version
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
compileOnly 'org.spigotmc:spigot:1.17-R0.1-SNAPSHOT'
|
compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
|
||||||
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
||||||
compileOnly 'org.bstats:bstats-bukkit:1.7'
|
compileOnly 'org.bstats:bstats-bukkit:1.7'
|
||||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||||
compileOnly 'me.clip:placeholderapi:2.10.9'
|
|
||||||
compileOnly 'com.google.code.gson:gson:2.8.7'
|
compileOnly 'com.google.code.gson:gson:2.8.7'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
java {
|
||||||
|
withJavadocJar()
|
||||||
|
}
|
||||||
|
|
||||||
compileJava.options.encoding = 'UTF-8'
|
compileJava.options.encoding = 'UTF-8'
|
||||||
compileJava.dependsOn clean
|
compileJava.dependsOn clean
|
||||||
|
|
||||||
@@ -26,4 +29,15 @@ publishing {
|
|||||||
artifactId 'eco'
|
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")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -12,6 +12,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for ProtocolLib packets.
|
||||||
|
*/
|
||||||
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||||
/**
|
/**
|
||||||
* The packet type to listen for.
|
* The packet type to listen for.
|
||||||
@@ -56,28 +59,6 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
this(plugin, type, ListenerPriority.NORMAL, postLoad);
|
this(plugin, type, ListenerPriority.NORMAL, postLoad);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* The code that should be executed once the packet has been received.
|
|
||||||
*
|
|
||||||
* @param packet The packet.
|
|
||||||
* @param player The player.
|
|
||||||
*/
|
|
||||||
public void onReceive(@NotNull final PacketContainer packet,
|
|
||||||
@NotNull final Player player) {
|
|
||||||
// Empty rather than abstract as implementations don't need both
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* THe code that should be executed once the packet has been sent.
|
|
||||||
*
|
|
||||||
* @param packet The packet.
|
|
||||||
* @param player The player.
|
|
||||||
*/
|
|
||||||
public void onSend(@NotNull final PacketContainer packet,
|
|
||||||
@NotNull final Player player) {
|
|
||||||
// Empty rather than abstract as implementations don't need both
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The code that should be executed once the packet has been received.
|
* The code that should be executed once the packet has been received.
|
||||||
*
|
*
|
||||||
@@ -119,7 +100,6 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
onReceive(event.getPacket(), event.getPlayer());
|
|
||||||
onReceive(event.getPacket(), event.getPlayer(), event);
|
onReceive(event.getPacket(), event.getPlayer(), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -138,10 +118,14 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
onSend(event.getPacket(), event.getPlayer());
|
|
||||||
onSend(event.getPacket(), event.getPlayer(), event);
|
onSend(event.getPacket(), event.getPlayer(), event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public final EcoPlugin getPlugin() {
|
||||||
|
return (EcoPlugin) super.getPlugin();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Register the packet adapter with ProtocolLib.
|
* Register the packet adapter with ProtocolLib.
|
||||||
*/
|
*/
|
||||||
|
|||||||
40
eco-api/src/main/java/com/willfp/eco/core/Eco.java
Normal file
40
eco-api/src/main/java/com/willfp/eco/core/Eco.java
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.jetbrains.annotations.ApiStatus;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Base class to hold the handler.
|
||||||
|
*
|
||||||
|
* @see Handler
|
||||||
|
*/
|
||||||
|
@UtilityClass
|
||||||
|
public class Eco {
|
||||||
|
/**
|
||||||
|
* Instance of eco handler.
|
||||||
|
* <p>
|
||||||
|
* The handler is, in essence, a way to interface between the eco-api
|
||||||
|
* frontend module, and the eco-backend implementations.
|
||||||
|
* <p>
|
||||||
|
* There shouldn't really be any reason to ever use the handler
|
||||||
|
* in your own plugins, but if you want to then you can - it's
|
||||||
|
* just a part of the API like any other.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private Handler handler;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the handler.
|
||||||
|
*
|
||||||
|
* @param handler The handler.
|
||||||
|
*/
|
||||||
|
@ApiStatus.Internal
|
||||||
|
public void setHandler(@NotNull final Handler handler) {
|
||||||
|
Validate.isTrue(Eco.handler == null, "Already initialized!");
|
||||||
|
|
||||||
|
Eco.handler = handler;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,9 @@
|
|||||||
package com.willfp.eco.core;
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
import com.willfp.eco.core.command.AbstractCommand;
|
import com.willfp.eco.core.command.impl.PluginCommand;
|
||||||
import com.willfp.eco.core.config.base.ConfigYml;
|
import com.willfp.eco.core.config.base.ConfigYml;
|
||||||
import com.willfp.eco.core.config.base.LangYml;
|
import com.willfp.eco.core.config.base.LangYml;
|
||||||
import com.willfp.eco.internal.config.updating.ConfigHandler;
|
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||||
import com.willfp.eco.core.display.Display;
|
import com.willfp.eco.core.display.Display;
|
||||||
import com.willfp.eco.core.display.DisplayModule;
|
import com.willfp.eco.core.display.DisplayModule;
|
||||||
import com.willfp.eco.core.events.EventManager;
|
import com.willfp.eco.core.events.EventManager;
|
||||||
@@ -13,21 +13,16 @@ 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.integrations.placeholder.PlaceholderManager;
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||||
|
import com.willfp.eco.core.proxy.AbstractProxy;
|
||||||
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
import com.willfp.eco.core.scheduling.Scheduler;
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
import com.willfp.eco.internal.UpdateChecker;
|
import com.willfp.eco.core.web.UpdateChecker;
|
||||||
import com.willfp.eco.internal.arrows.ArrowDataListener;
|
|
||||||
import com.willfp.eco.internal.events.EcoEventManager;
|
|
||||||
import com.willfp.eco.internal.extensions.EcoExtensionLoader;
|
|
||||||
import com.willfp.eco.internal.factory.EcoMetadataValueFactory;
|
|
||||||
import com.willfp.eco.internal.factory.EcoNamespacedKeyFactory;
|
|
||||||
import com.willfp.eco.internal.factory.EcoRunnableFactory;
|
|
||||||
import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI;
|
|
||||||
import com.willfp.eco.internal.logging.EcoLogger;
|
|
||||||
import com.willfp.eco.internal.scheduling.EcoScheduler;
|
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
|
||||||
import org.bstats.bukkit.Metrics;
|
import org.bstats.bukkit.Metrics;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.configuration.file.FileConfiguration;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.plugin.Plugin;
|
import org.bukkit.plugin.Plugin;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
@@ -42,18 +37,22 @@ import java.util.Set;
|
|||||||
import java.util.logging.Logger;
|
import java.util.logging.Logger;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* EcoPlugin is the base plugin class for eco-based plugins.
|
||||||
|
* <p>
|
||||||
|
* It functions as a replacement for {@link JavaPlugin}.
|
||||||
|
* <p>
|
||||||
|
* EcoPlugin is a lot more powerful than {@link JavaPlugin} and
|
||||||
|
* contains many methods to reduce boilerplate code and reduce
|
||||||
|
* plugin complexity.
|
||||||
|
* <p>
|
||||||
|
* It is recommended to view the source code for this class to
|
||||||
|
* gain a better understanding of how it works.
|
||||||
|
* <p>
|
||||||
|
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
||||||
|
* be cancelled.</b>
|
||||||
|
*/
|
||||||
public abstract class EcoPlugin extends JavaPlugin {
|
public abstract class EcoPlugin extends JavaPlugin {
|
||||||
/**
|
|
||||||
* Loaded eco plugins.
|
|
||||||
*/
|
|
||||||
public static final List<String> LOADED_ECO_PLUGINS = new ArrayList<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The name of the plugin.
|
|
||||||
*/
|
|
||||||
@Getter
|
|
||||||
private final String pluginName;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The spigot resource ID of the plugin.
|
* The spigot resource ID of the plugin.
|
||||||
*/
|
*/
|
||||||
@@ -84,11 +83,6 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
@Getter
|
@Getter
|
||||||
private final Set<String> loadedIntegrations = new HashSet<>();
|
private final Set<String> loadedIntegrations = new HashSet<>();
|
||||||
|
|
||||||
/**
|
|
||||||
* Set of classes to be processed on config update.
|
|
||||||
*/
|
|
||||||
private final List<Class<?>> updatableClasses = new ArrayList<>();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The internal plugin scheduler.
|
* The internal plugin scheduler.
|
||||||
*/
|
*/
|
||||||
@@ -163,38 +157,158 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
private boolean outdated = false;
|
private boolean outdated = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new plugin.
|
* If the plugin supports extensions.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final boolean supportingExtensions;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The proxy factory.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final ProxyFactory proxyFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin without a specified color, proxy support, spigot, or bStats.
|
||||||
|
*/
|
||||||
|
protected EcoPlugin() {
|
||||||
|
this("&f");
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin without proxy support, spigot, or bStats.
|
||||||
|
*
|
||||||
|
* @param color The color.
|
||||||
|
*/
|
||||||
|
protected EcoPlugin(@NotNull final String color) {
|
||||||
|
this("", color);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin unlinked to spigot and bStats.
|
||||||
|
*
|
||||||
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
*/
|
||||||
|
protected EcoPlugin(@NotNull final String proxyPackage,
|
||||||
|
@NotNull final String color) {
|
||||||
|
this(0, 0, proxyPackage, color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin without proxy or extension support.
|
||||||
|
*
|
||||||
|
* @param resourceId The spigot 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)
|
||||||
|
*/
|
||||||
|
protected EcoPlugin(final int resourceId,
|
||||||
|
final int bStatsId,
|
||||||
|
@NotNull final String color) {
|
||||||
|
this(resourceId, bStatsId, "", color);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin without proxy support.
|
||||||
|
*
|
||||||
|
* @param resourceId The spigot 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 supportingExtensions If the plugin supports extensions.
|
||||||
|
*/
|
||||||
|
protected EcoPlugin(final int resourceId,
|
||||||
|
final int bStatsId,
|
||||||
|
@NotNull final String color,
|
||||||
|
final boolean supportingExtensions) {
|
||||||
|
this(resourceId, bStatsId, "", color, supportingExtensions);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin without extension support.
|
||||||
*
|
*
|
||||||
* @param pluginName The name of the plugin.
|
|
||||||
* @param resourceId The spigot resource ID for the plugin.
|
* @param resourceId The spigot resource ID for the plugin.
|
||||||
* @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, such as &a, &b)
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
*/
|
*/
|
||||||
protected EcoPlugin(@NotNull final String pluginName,
|
protected EcoPlugin(final int resourceId,
|
||||||
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) {
|
||||||
this.pluginName = pluginName;
|
this(resourceId, bStatsId, proxyPackage, color, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new plugin.
|
||||||
|
*
|
||||||
|
* @param resourceId The spigot resource ID for the plugin.
|
||||||
|
* @param bStatsId The bStats resource ID for the plugin.
|
||||||
|
* @param proxyPackage The package where proxy implementations are stored.
|
||||||
|
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||||
|
* @param supportingExtensions If the plugin supports extensions.
|
||||||
|
*/
|
||||||
|
protected EcoPlugin(final int resourceId,
|
||||||
|
final int bStatsId,
|
||||||
|
@NotNull final String proxyPackage,
|
||||||
|
@NotNull final String color,
|
||||||
|
final boolean supportingExtensions) {
|
||||||
|
/*
|
||||||
|
The handler must be initialized before any plugin's constructors
|
||||||
|
are called, as the constructors call Eco#getHandler().
|
||||||
|
|
||||||
|
To fix this, EcoSpigotPlugin an abstract class and the 'actual'
|
||||||
|
plugin class is EcoHandler - that way I can create the handler
|
||||||
|
before any plugins are loaded while still having a separation between
|
||||||
|
the plugin class and the handler class (for code clarity).
|
||||||
|
|
||||||
|
I don't really like the fact that the handler class *is* the
|
||||||
|
spigot plugin, but it is what it is.
|
||||||
|
|
||||||
|
There is probably a better way of doing it - maybe with
|
||||||
|
some sort of HandlerCreator interface in order to still have
|
||||||
|
a standalone handler class, but then there would be an interface
|
||||||
|
left in the API that doesn't really help anything.
|
||||||
|
|
||||||
|
The other alternative would be do use reflection to get a 'createHandler'
|
||||||
|
method that only exists in EcoSpigotPlugin - but that feels really dirty
|
||||||
|
and I'd rather only use reflection where necessary.
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (Eco.getHandler() == null && this instanceof Handler) {
|
||||||
|
/*
|
||||||
|
This code is only ever called by EcoSpigotPlugin (EcoHandler)
|
||||||
|
as it's the first plugin to load and it is a handler.
|
||||||
|
|
||||||
|
Any other plugins will never call this code as the handler
|
||||||
|
will have already been initialized.
|
||||||
|
*/
|
||||||
|
|
||||||
|
Eco.setHandler((Handler) this);
|
||||||
|
}
|
||||||
|
|
||||||
|
assert Eco.getHandler() != null;
|
||||||
|
|
||||||
this.resourceId = resourceId;
|
this.resourceId = resourceId;
|
||||||
this.bStatsId = bStatsId;
|
this.bStatsId = bStatsId;
|
||||||
this.proxyPackage = proxyPackage;
|
this.proxyPackage = proxyPackage;
|
||||||
this.color = color;
|
this.color = color;
|
||||||
|
this.supportingExtensions = supportingExtensions;
|
||||||
|
|
||||||
this.scheduler = new EcoScheduler(this);
|
this.scheduler = Eco.getHandler().createScheduler(this);
|
||||||
this.eventManager = new EcoEventManager(this);
|
this.eventManager = Eco.getHandler().createEventManager(this);
|
||||||
this.namespacedKeyFactory = new EcoNamespacedKeyFactory(this);
|
this.namespacedKeyFactory = Eco.getHandler().createNamespacedKeyFactory(this);
|
||||||
this.metadataValueFactory = new EcoMetadataValueFactory(this);
|
this.metadataValueFactory = Eco.getHandler().createMetadataValueFactory(this);
|
||||||
this.runnableFactory = new EcoRunnableFactory(this);
|
this.runnableFactory = Eco.getHandler().createRunnableFactory(this);
|
||||||
this.extensionLoader = new EcoExtensionLoader(this);
|
this.extensionLoader = Eco.getHandler().createExtensionLoader(this);
|
||||||
this.configHandler = new ConfigHandler(this);
|
this.configHandler = Eco.getHandler().createConfigHandler(this);
|
||||||
this.logger = new EcoLogger(this);
|
this.logger = Eco.getHandler().createLogger(this);
|
||||||
|
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.getHandler().createProxyFactory(this);
|
||||||
|
|
||||||
this.langYml = new LangYml(this);
|
this.langYml = new LangYml(this);
|
||||||
this.configYml = new ConfigYml(this);
|
this.configYml = new ConfigYml(this);
|
||||||
|
|
||||||
LOADED_ECO_PLUGINS.add(this.getName().toLowerCase());
|
Eco.getHandler().addNewPlugin(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -205,33 +319,45 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
super.onEnable();
|
super.onEnable();
|
||||||
|
|
||||||
this.getLogger().info("");
|
this.getLogger().info("");
|
||||||
this.getLogger().info("Loading " + this.color + this.pluginName);
|
this.getLogger().info("Loading " + this.getColor() + this.getName());
|
||||||
|
|
||||||
this.getEventManager().registerListener(new ArrowDataListener(this));
|
|
||||||
|
|
||||||
|
if (this.getResourceId() != 0) {
|
||||||
new UpdateChecker(this).getVersion(version -> {
|
new UpdateChecker(this).getVersion(version -> {
|
||||||
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(this.getDescription().getVersion());
|
DefaultArtifactVersion currentVersion = new DefaultArtifactVersion(this.getDescription().getVersion());
|
||||||
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
DefaultArtifactVersion mostRecentVersion = new DefaultArtifactVersion(version);
|
||||||
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
if (!(currentVersion.compareTo(mostRecentVersion) > 0 || currentVersion.equals(mostRecentVersion))) {
|
||||||
this.outdated = true;
|
this.outdated = true;
|
||||||
this.getScheduler().runTimer(() -> {
|
this.getScheduler().runTimer(() -> {
|
||||||
this.getLogger().info("&c " + this.pluginName + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
this.getLogger().info("&c " + this.getName() + " is out of date! (Version " + this.getDescription().getVersion() + ")");
|
||||||
this.getLogger().info("&cThe newest version is &f" + version);
|
this.getLogger().info("&cThe newest version is &f" + version);
|
||||||
this.getLogger().info("&cDownload the new version!");
|
this.getLogger().info("&cDownload the new version!");
|
||||||
}, 0, 864000);
|
}, 0, 864000);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
new Metrics(this, this.bStatsId);
|
DefaultArtifactVersion runningVersion = new DefaultArtifactVersion(Eco.getHandler().getEcoPlugin().getDescription().getVersion());
|
||||||
|
DefaultArtifactVersion requiredVersion = new DefaultArtifactVersion(this.getMinimumEcoVersion());
|
||||||
|
if (!(runningVersion.compareTo(requiredVersion) > 0 || runningVersion.equals(requiredVersion))) {
|
||||||
|
this.getLogger().severe("You are running an outdated version of eco!");
|
||||||
|
this.getLogger().severe("You must be on at least" + this.getMinimumEcoVersion());
|
||||||
|
this.getLogger().severe("Download the newest version here:");
|
||||||
|
this.getLogger().severe("https://polymart.org/download/773/recent/JSpprMspkuyecf5y1wQ2Jn8OoLQSQ_IW");
|
||||||
|
Bukkit.getPluginManager().disablePlugin(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.getBStatsId() != 0) {
|
||||||
|
new Metrics(this, this.getBStatsId());
|
||||||
|
}
|
||||||
|
|
||||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toSet());
|
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toSet());
|
||||||
|
|
||||||
if (enabledPlugins.contains("PlaceholderAPI")) {
|
if (enabledPlugins.contains("PlaceholderAPI")) {
|
||||||
this.loadedIntegrations.add("PlaceholderAPI");
|
this.loadedIntegrations.add("PlaceholderAPI");
|
||||||
PlaceholderManager.addIntegration(new PlaceholderIntegrationPAPI(this));
|
PlaceholderManager.addIntegration(Eco.getHandler().createPAPIIntegration(this));
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getIntegrationLoaders().forEach((integrationLoader -> {
|
this.loadIntegrationLoaders().forEach((integrationLoader -> {
|
||||||
if (enabledPlugins.contains(integrationLoader.getPluginName())) {
|
if (enabledPlugins.contains(integrationLoader.getPluginName())) {
|
||||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||||
integrationLoader.load();
|
integrationLoader.load();
|
||||||
@@ -242,23 +368,30 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
|
|
||||||
Prerequisite.update();
|
Prerequisite.update();
|
||||||
|
|
||||||
this.getPacketAdapters().forEach(abstractPacketAdapter -> {
|
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||||
if (!abstractPacketAdapter.isPostLoad()) {
|
if (!abstractPacketAdapter.isPostLoad()) {
|
||||||
abstractPacketAdapter.register();
|
abstractPacketAdapter.register();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
updatableClasses.addAll(this.getUpdatableClasses());
|
this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
||||||
|
|
||||||
this.getListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
this.loadPluginCommands().forEach(PluginCommand::register);
|
||||||
|
|
||||||
this.getCommands().forEach(AbstractCommand::register);
|
|
||||||
|
|
||||||
this.getScheduler().runLater(this::afterLoad, 1);
|
this.getScheduler().runLater(this::afterLoad, 1);
|
||||||
|
|
||||||
this.updatableClasses.forEach(clazz -> this.getConfigHandler().registerUpdatableClass(clazz));
|
if (this.isSupportingExtensions()) {
|
||||||
|
this.getExtensionLoader().loadExtensions();
|
||||||
|
|
||||||
this.enable();
|
if (this.getExtensionLoader().getLoadedExtensions().isEmpty()) {
|
||||||
|
this.getLogger().info("&cNo extensions found");
|
||||||
|
} else {
|
||||||
|
this.getLogger().info("Extensions Loaded:");
|
||||||
|
this.getExtensionLoader().getLoadedExtensions().forEach(extension -> this.getLogger().info("- " + extension.getName() + " v" + extension.getVersion()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.handleEnable();
|
||||||
|
|
||||||
this.getLogger().info("");
|
this.getLogger().info("");
|
||||||
}
|
}
|
||||||
@@ -274,7 +407,14 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
this.getScheduler().cancelAll();
|
this.getScheduler().cancelAll();
|
||||||
this.getConfigHandler().saveAllConfigs();
|
this.getConfigHandler().saveAllConfigs();
|
||||||
|
|
||||||
this.disable();
|
this.handleDisable();
|
||||||
|
|
||||||
|
if (this.isSupportingExtensions()) {
|
||||||
|
this.getExtensionLoader().unloadExtensions();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getLogger().info("Cleaning up...");
|
||||||
|
Eco.getHandler().getCleaner().clean(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -284,7 +424,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
public final void onLoad() {
|
public final void onLoad() {
|
||||||
super.onLoad();
|
super.onLoad();
|
||||||
|
|
||||||
this.load();
|
this.handleLoad();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -297,7 +437,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
Display.registerDisplayModule(this.getDisplayModule());
|
Display.registerDisplayModule(this.getDisplayModule());
|
||||||
}
|
}
|
||||||
|
|
||||||
this.getPacketAdapters().forEach(abstractPacketAdapter -> {
|
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||||
if (abstractPacketAdapter.isPostLoad()) {
|
if (abstractPacketAdapter.isPostLoad()) {
|
||||||
abstractPacketAdapter.register();
|
abstractPacketAdapter.register();
|
||||||
}
|
}
|
||||||
@@ -316,65 +456,90 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
this.getLogger().severe("");
|
this.getLogger().severe("");
|
||||||
}
|
}
|
||||||
|
|
||||||
this.postLoad();
|
this.handleAfterLoad();
|
||||||
|
|
||||||
this.reload();
|
this.reload();
|
||||||
|
|
||||||
this.getLogger().info("Loaded " + this.color + this.pluginName);
|
this.getLogger().info("Loaded " + this.color + this.getName());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Default code to be executed on plugin reload.
|
* Default code to be executed on plugin reload.
|
||||||
*/
|
*/
|
||||||
public final void reload() {
|
public final void reload() {
|
||||||
this.getConfigYml().update();
|
this.getConfigHandler().updateConfigs();
|
||||||
this.getLangYml().update();
|
|
||||||
|
|
||||||
this.getConfigHandler().callUpdate();
|
this.getConfigHandler().callUpdate();
|
||||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||||
this.getScheduler().cancelAll();
|
this.getScheduler().cancelAll();
|
||||||
|
|
||||||
this.onReload();
|
this.handleReload();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific code to be executed on enable.
|
* The plugin-specific code to be executed on enable.
|
||||||
|
* <p>
|
||||||
|
* Override when needed.
|
||||||
*/
|
*/
|
||||||
public abstract void enable();
|
protected void handleEnable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific code to be executed on disable.
|
* The plugin-specific code to be executed on disable.
|
||||||
|
* <p>
|
||||||
|
* Override when needed.
|
||||||
*/
|
*/
|
||||||
public abstract void disable();
|
protected void handleDisable() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific code to be executed on load.
|
* The plugin-specific code to be executed on load.
|
||||||
|
* <p>
|
||||||
|
* This is executed before enabling.
|
||||||
|
* <p>
|
||||||
|
* Override when needed.
|
||||||
*/
|
*/
|
||||||
public abstract void load();
|
protected void handleLoad() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific code to be executed on reload.
|
* The plugin-specific code to be executed on reload.
|
||||||
|
* <p>
|
||||||
|
* Override when needed.
|
||||||
*/
|
*/
|
||||||
public abstract void onReload();
|
protected void handleReload() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific code to be executed after the server is up.
|
* The plugin-specific code to be executed after the server is up.
|
||||||
|
* <p>
|
||||||
|
* Override when needed.
|
||||||
*/
|
*/
|
||||||
public abstract void postLoad();
|
protected void handleAfterLoad() {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The plugin-specific integrations to be tested and loaded.
|
* The plugin-specific integrations to be tested and loaded.
|
||||||
*
|
*
|
||||||
* @return A list of integrations.
|
* @return A list of integrations.
|
||||||
*/
|
*/
|
||||||
public abstract List<IntegrationLoader> getIntegrationLoaders();
|
protected List<IntegrationLoader> loadIntegrationLoaders() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The command to be registered.
|
* The commands to be registered.
|
||||||
*
|
*
|
||||||
* @return A list of commands.
|
* @return A list of commands.
|
||||||
*/
|
*/
|
||||||
public abstract List<AbstractCommand> getCommands();
|
protected List<PluginCommand> loadPluginCommands() {
|
||||||
|
return new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ProtocolLib packet adapters to be registered.
|
* ProtocolLib packet adapters to be registered.
|
||||||
@@ -383,21 +548,16 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
*
|
*
|
||||||
* @return A list of packet adapters.
|
* @return A list of packet adapters.
|
||||||
*/
|
*/
|
||||||
public abstract List<AbstractPacketAdapter> getPacketAdapters();
|
protected List<AbstractPacketAdapter> loadPacketAdapters() {
|
||||||
|
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.
|
||||||
*/
|
*/
|
||||||
public abstract List<Listener> getListeners();
|
protected abstract List<Listener> loadListeners();
|
||||||
|
|
||||||
/**
|
|
||||||
* All updatable classes.
|
|
||||||
*
|
|
||||||
* @return A list of all updatable classes.
|
|
||||||
*/
|
|
||||||
public abstract List<Class<?>> getUpdatableClasses();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create the display module for the plugin.
|
* Create the display module for the plugin.
|
||||||
@@ -406,12 +566,118 @@ public abstract class EcoPlugin extends JavaPlugin {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
protected DisplayModule createDisplayModule() {
|
protected DisplayModule createDisplayModule() {
|
||||||
|
Validate.isTrue(
|
||||||
|
this.getDisplayModule() == null,
|
||||||
|
"Display module exists!"
|
||||||
|
);
|
||||||
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the minimum version of eco to use the plugin.
|
||||||
|
*
|
||||||
|
* @return The version.
|
||||||
|
*/
|
||||||
|
public String getMinimumEcoVersion() {
|
||||||
|
return "6.0.0";
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin's logger.
|
||||||
|
*
|
||||||
|
* @return The logger.
|
||||||
|
*/
|
||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public Logger getLogger() {
|
public Logger getLogger() {
|
||||||
return logger;
|
return logger;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a proxy.
|
||||||
|
*
|
||||||
|
* @param proxyClass The proxy class.
|
||||||
|
* @param <T> The proxy type.
|
||||||
|
* @return The proxy.
|
||||||
|
*/
|
||||||
|
public <T extends AbstractProxy> T getProxy(@NotNull final Class<T> proxyClass) {
|
||||||
|
Validate.notNull(proxyFactory, "Plugin does not support proxy!");
|
||||||
|
|
||||||
|
return proxyFactory.getProxy(proxyClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get unwrapped config.
|
||||||
|
* Does not use eco config system, don't use.
|
||||||
|
*
|
||||||
|
* @return The bukkit config.
|
||||||
|
* @deprecated Use getConfigYml() instead.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public final FileConfiguration getConfig() {
|
||||||
|
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||||
|
|
||||||
|
return this.getConfigYml().getBukkitHandle();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does not use eco config system, don't use.
|
||||||
|
*
|
||||||
|
* @deprecated Use eco config system.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public final void saveConfig() {
|
||||||
|
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||||
|
|
||||||
|
super.saveConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does not use eco config system, don't use.
|
||||||
|
*
|
||||||
|
* @deprecated Use eco config system.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public final void saveDefaultConfig() {
|
||||||
|
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||||
|
|
||||||
|
super.saveDefaultConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does not use eco config system, don't use.
|
||||||
|
*
|
||||||
|
* @deprecated Use eco config system.
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
@Deprecated
|
||||||
|
public final void reloadConfig() {
|
||||||
|
this.getLogger().warning("Call to default config method in eco plugin!");
|
||||||
|
|
||||||
|
super.reloadConfig();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an EcoPlugin by name.
|
||||||
|
*
|
||||||
|
* @param pluginName The name.
|
||||||
|
* @return The plugin.
|
||||||
|
*/
|
||||||
|
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||||
|
return Eco.getHandler().getPluginByName(pluginName);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all EcoPlugin names.
|
||||||
|
*
|
||||||
|
* @return The set of names.
|
||||||
|
*/
|
||||||
|
public static Set<String> getPluginNames() {
|
||||||
|
return new HashSet<>(Eco.getHandler().getLoadedPlugins());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
161
eco-api/src/main/java/com/willfp/eco/core/Handler.java
Normal file
161
eco-api/src/main/java/com/willfp/eco/core/Handler.java
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
package com.willfp.eco.core;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.updating.ConfigHandler;
|
||||||
|
import com.willfp.eco.core.config.wrapper.ConfigFactory;
|
||||||
|
import com.willfp.eco.core.drops.DropQueueFactory;
|
||||||
|
import com.willfp.eco.core.events.EventManager;
|
||||||
|
import com.willfp.eco.core.extensions.ExtensionLoader;
|
||||||
|
import com.willfp.eco.core.factory.MetadataValueFactory;
|
||||||
|
import com.willfp.eco.core.factory.NamespacedKeyFactory;
|
||||||
|
import com.willfp.eco.core.factory.RunnableFactory;
|
||||||
|
import com.willfp.eco.core.gui.GUIFactory;
|
||||||
|
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||||
|
import com.willfp.eco.core.proxy.Cleaner;
|
||||||
|
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||||
|
import com.willfp.eco.core.scheduling.Scheduler;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.logging.Logger;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see Eco
|
||||||
|
*/
|
||||||
|
public interface Handler {
|
||||||
|
/**
|
||||||
|
* Create a scheduler.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The scheduler.
|
||||||
|
*/
|
||||||
|
Scheduler createScheduler(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an event manager.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The event manager.
|
||||||
|
*/
|
||||||
|
EventManager createEventManager(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a NamespacedKey factory.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
NamespacedKeyFactory createNamespacedKeyFactory(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a MetadataValue factory.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
MetadataValueFactory createMetadataValueFactory(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a Runnable factory.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
RunnableFactory createRunnableFactory(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create an ExtensionLoader.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
ExtensionLoader createExtensionLoader(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a config handler.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The handler.
|
||||||
|
*/
|
||||||
|
ConfigHandler createConfigHandler(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a logger.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The logger.
|
||||||
|
*/
|
||||||
|
Logger createLogger(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a PAPI integration.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The integration.
|
||||||
|
*/
|
||||||
|
PlaceholderIntegration createPAPIIntegration(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a proxy factory.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
ProxyFactory createProxyFactory(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get eco Spigot plugin.
|
||||||
|
*
|
||||||
|
* @return The plugin.
|
||||||
|
*/
|
||||||
|
EcoPlugin getEcoPlugin();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get config factory.
|
||||||
|
*
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
ConfigFactory getConfigFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get drop queue factory.
|
||||||
|
*
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
DropQueueFactory getDropQueueFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get GUI factory.
|
||||||
|
*
|
||||||
|
* @return The factory.
|
||||||
|
*/
|
||||||
|
GUIFactory getGUIFactory();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get cleaner.
|
||||||
|
*
|
||||||
|
* @return The cleaner.
|
||||||
|
*/
|
||||||
|
Cleaner getCleaner();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new plugin.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
*/
|
||||||
|
void addNewPlugin(@NotNull EcoPlugin plugin);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get plugin by name.
|
||||||
|
*
|
||||||
|
* @param name The name.
|
||||||
|
* @return The plugin.
|
||||||
|
*/
|
||||||
|
EcoPlugin getPluginByName(@NotNull String name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all loaded eco plugins.
|
||||||
|
*
|
||||||
|
* @return A list of plugin names in lowercase.
|
||||||
|
*/
|
||||||
|
List<String> getLoadedPlugins();
|
||||||
|
}
|
||||||
@@ -4,19 +4,24 @@ import lombok.AccessLevel;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public abstract class PluginDependent {
|
/**
|
||||||
|
* Quick DI class to manage passing eco plugins.
|
||||||
|
*
|
||||||
|
* @param <T> The eco plugin type.
|
||||||
|
*/
|
||||||
|
public abstract class PluginDependent<T extends EcoPlugin> {
|
||||||
/**
|
/**
|
||||||
* The {@link EcoPlugin} that is stored.
|
* The {@link EcoPlugin} that is stored.
|
||||||
*/
|
*/
|
||||||
@Getter(AccessLevel.PROTECTED)
|
@Getter(AccessLevel.PROTECTED)
|
||||||
private final EcoPlugin plugin;
|
private final T plugin;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
* Pass an {@link EcoPlugin} in order to interface with it.
|
||||||
*
|
*
|
||||||
* @param plugin The plugin to manage.
|
* @param plugin The plugin to manage.
|
||||||
*/
|
*/
|
||||||
protected PluginDependent(@NotNull final EcoPlugin plugin) {
|
protected PluginDependent(@NotNull final T plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,12 @@ import java.util.Arrays;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A prerequisite is a requirement for something.
|
||||||
|
* <p>
|
||||||
|
* For example, you can require the server to have paper or be a specific version,
|
||||||
|
* or have some other dependency.
|
||||||
|
*/
|
||||||
public class Prerequisite {
|
public class Prerequisite {
|
||||||
/**
|
/**
|
||||||
* All existing prerequisites are registered on creation.
|
* All existing prerequisites are registered on creation.
|
||||||
@@ -24,15 +30,6 @@ public class Prerequisite {
|
|||||||
"Requires server to be running paper (or a fork)"
|
"Requires server to be running paper (or a fork)"
|
||||||
);
|
);
|
||||||
|
|
||||||
/**
|
|
||||||
* Requires the server to be running 1.17.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public static final Prerequisite v1_17 = new Prerequisite(
|
|
||||||
() -> ProxyConstants.NMS_VERSION.contains("17"),
|
|
||||||
"Requires server to be running 1.17+"
|
|
||||||
);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Requires the server to be running 1.17.
|
* Requires the server to be running 1.17.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,154 +0,0 @@
|
|||||||
package com.willfp.eco.core.command;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginDependent;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.bukkit.Bukkit;
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandExecutor;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.command.PluginCommand;
|
|
||||||
import org.bukkit.entity.Player;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class AbstractCommand extends PluginDependent implements CommandExecutor {
|
|
||||||
/**
|
|
||||||
* The name of the command
|
|
||||||
* <p>
|
|
||||||
* i.e. the name used on execution, for example /enchantinfo would have the name enchantinfo.
|
|
||||||
*/
|
|
||||||
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;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new command.
|
|
||||||
* <p>
|
|
||||||
* The command will not be registered until {@link this#register()} is called.
|
|
||||||
* <p>
|
|
||||||
* The name cannot be the same as an existing command as this will conflict.
|
|
||||||
*
|
|
||||||
* @param plugin The owning {@link EcoPlugin}.
|
|
||||||
* @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.
|
|
||||||
*/
|
|
||||||
protected AbstractCommand(@NotNull final EcoPlugin plugin,
|
|
||||||
@NotNull final String name,
|
|
||||||
@NotNull final String permission,
|
|
||||||
final boolean playersOnly) {
|
|
||||||
super(plugin);
|
|
||||||
this.name = name;
|
|
||||||
this.permission = permission;
|
|
||||||
this.playersOnly = playersOnly;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the {@link AbstractTabCompleter} associated with this command.
|
|
||||||
* <p>
|
|
||||||
* Implementations of {@link AbstractCommand} do not have to override this method:
|
|
||||||
* null represents no associated tab-completer.
|
|
||||||
*
|
|
||||||
* @return The associated {@link AbstractTabCompleter}, or null if none associated.
|
|
||||||
*/
|
|
||||||
public @Nullable AbstractTabCompleter getTab() {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the name of the permission required to execute this command.
|
|
||||||
*
|
|
||||||
* @return The name of the permission.
|
|
||||||
*/
|
|
||||||
public String getPermission() {
|
|
||||||
return this.permission;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the name of the command used in execution.
|
|
||||||
*
|
|
||||||
* @return The command name.
|
|
||||||
*/
|
|
||||||
public String getName() {
|
|
||||||
return this.name;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal implementation used to clean up boilerplate.
|
|
||||||
* Used for parity with {@link CommandExecutor#onCommand(CommandSender, Command, String, String[])}.
|
|
||||||
* <p>
|
|
||||||
* Calls {@link this#onExecute(CommandSender, List)}.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
public final boolean onCommand(@NotNull final CommandSender sender,
|
|
||||||
@NotNull final Command command,
|
|
||||||
@NotNull final String label,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
if (!command.getName().equalsIgnoreCase(name)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playersOnly && !(sender instanceof Player)) {
|
|
||||||
sender.sendMessage(this.getPlugin().getLangYml().getMessage("not-player"));
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sender.hasPermission(permission) && sender instanceof Player) {
|
|
||||||
sender.sendMessage(this.getPlugin().getLangYml().getNoPermission());
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
onExecute(sender, Arrays.asList(args));
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Registers the command with the server,
|
|
||||||
* <p>
|
|
||||||
* Requires the command name to exist, defined in plugin.yml.
|
|
||||||
*/
|
|
||||||
public final void register() {
|
|
||||||
PluginCommand command = Bukkit.getPluginCommand(name);
|
|
||||||
assert command != null;
|
|
||||||
command.setExecutor(this);
|
|
||||||
|
|
||||||
AbstractTabCompleter tabCompleter = this.getTab();
|
|
||||||
if (tabCompleter != null) {
|
|
||||||
command.setTabCompleter(tabCompleter);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The code for the execution of the command (The actual functionality).
|
|
||||||
* <p>
|
|
||||||
* Unlike {@link this#onCommand(CommandSender, Command, String, String[])},
|
|
||||||
* this does not return a value as the command <b>will</b> have been processed.
|
|
||||||
*
|
|
||||||
* @param sender The sender of the command
|
|
||||||
* @param args The arguments of the command
|
|
||||||
*/
|
|
||||||
protected abstract void onExecute(CommandSender sender,
|
|
||||||
List<String> args);
|
|
||||||
}
|
|
||||||
@@ -1,65 +0,0 @@
|
|||||||
package com.willfp.eco.core.command;
|
|
||||||
|
|
||||||
import org.bukkit.command.Command;
|
|
||||||
import org.bukkit.command.CommandSender;
|
|
||||||
import org.bukkit.command.TabCompleter;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
import org.jetbrains.annotations.Nullable;
|
|
||||||
|
|
||||||
import java.util.Arrays;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
public abstract class AbstractTabCompleter implements TabCompleter {
|
|
||||||
/**
|
|
||||||
* The {@link AbstractCommand} that is tab-completed.
|
|
||||||
*/
|
|
||||||
private final AbstractCommand command;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a tab-completer for a specified {@link AbstractCommand}.
|
|
||||||
*
|
|
||||||
* @param command The command to tab-complete.
|
|
||||||
*/
|
|
||||||
protected AbstractTabCompleter(@NotNull final AbstractCommand command) {
|
|
||||||
this.command = command;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Internal implementation used to clean up boilerplate.
|
|
||||||
* Used for parity with {@link TabCompleter#onTabComplete(CommandSender, Command, String, String[])}.
|
|
||||||
* <p>
|
|
||||||
* Calls {@link this#onTab(CommandSender, List)}.
|
|
||||||
*
|
|
||||||
* @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
|
|
||||||
public @Nullable List<String> onTabComplete(@NotNull final CommandSender sender,
|
|
||||||
@NotNull final Command command,
|
|
||||||
@NotNull final String label,
|
|
||||||
@NotNull final String[] args) {
|
|
||||||
if (!command.getName().equalsIgnoreCase(this.command.getName())) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!sender.hasPermission(this.command.getPermission())) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return onTab(sender, Arrays.asList(args));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The code for the tab-completion of the command (The actual functionality).
|
|
||||||
* <p>
|
|
||||||
*
|
|
||||||
* @param sender The sender of the command.
|
|
||||||
* @param args The arguments of the command.
|
|
||||||
* @return The list of tab-completions.
|
|
||||||
*/
|
|
||||||
public abstract List<String> onTab(@NotNull CommandSender sender,
|
|
||||||
@NotNull List<String> args);
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.willfp.eco.core.command;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for all command implementations.
|
||||||
|
*/
|
||||||
|
public interface CommandBase {
|
||||||
|
/**
|
||||||
|
* Get command name.
|
||||||
|
*
|
||||||
|
* @return The name.
|
||||||
|
*/
|
||||||
|
String getName();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get command permission.
|
||||||
|
*
|
||||||
|
* @return The permission.
|
||||||
|
*/
|
||||||
|
String getPermission();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* If only players can execute the command.
|
||||||
|
*
|
||||||
|
* @return If true.
|
||||||
|
*/
|
||||||
|
boolean isPlayersOnly();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add a subcommand to the command.
|
||||||
|
*
|
||||||
|
* @param command The subcommand.
|
||||||
|
* @return The parent command.
|
||||||
|
*/
|
||||||
|
CommandBase addSubcommand(@NotNull CommandBase command);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the handler.
|
||||||
|
*
|
||||||
|
* @return The handler.
|
||||||
|
*/
|
||||||
|
CommandHandler getHandler();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the tab completer.
|
||||||
|
*
|
||||||
|
* @return The tab completer.
|
||||||
|
*/
|
||||||
|
TabCompleteHandler getTabCompleter();
|
||||||
|
}
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
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
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
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,26 @@
|
|||||||
|
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
|
||||||
|
*/
|
||||||
|
@FunctionalInterface
|
||||||
|
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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,198 @@
|
|||||||
|
package com.willfp.eco.core.command.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.PluginDependent;
|
||||||
|
import com.willfp.eco.core.command.CommandBase;
|
||||||
|
import com.willfp.eco.core.command.CommandHandler;
|
||||||
|
import com.willfp.eco.core.command.TabCompleteHandler;
|
||||||
|
import lombok.AccessLevel;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.util.StringUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
|
||||||
|
/**
|
||||||
|
* The name of the command.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final String name;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The permission required to execute the command.
|
||||||
|
* <p>
|
||||||
|
* Written out as a string for flexibility with subclasses.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
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.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final boolean playersOnly;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All subcommands for the command.
|
||||||
|
*/
|
||||||
|
@Getter(AccessLevel.PROTECTED)
|
||||||
|
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) {
|
||||||
|
super(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getHandler().onExecute(sender, 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().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 (args[0].equalsIgnoreCase(subcommand.getName())) {
|
||||||
|
command = (HandledCommand) subcommand;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (command != null) {
|
||||||
|
return command.handleTabCompletion(sender, Arrays.copyOfRange(args, 1, args.length));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract CommandHandler getHandler();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public TabCompleteHandler getTabCompleter() {
|
||||||
|
return (sender, args) -> new ArrayList<>();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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 (command.isPlayersOnly() && !(sender instanceof Player)) {
|
||||||
|
sender.sendMessage(plugin.getLangYml().getMessage("not-player"));
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!sender.hasPermission(command.getPermission()) && sender instanceof Player) {
|
||||||
|
sender.sendMessage(plugin.getLangYml().getNoPermission());
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,94 @@
|
|||||||
|
package com.willfp.eco.core.command.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import org.bukkit.Bukkit;
|
||||||
|
import org.bukkit.command.Command;
|
||||||
|
import org.bukkit.command.CommandExecutor;
|
||||||
|
import org.bukkit.command.CommandSender;
|
||||||
|
import org.bukkit.command.TabCompleter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PluginCommands are the class to be used instead of CommandExecutor.
|
||||||
|
* <p>
|
||||||
|
* The command will not be registered until register() is called.
|
||||||
|
* <p>
|
||||||
|
* The name cannot be the same as an existing command as this will conflict.
|
||||||
|
*/
|
||||||
|
public abstract class PluginCommand extends HandledCommand implements CommandExecutor, TabCompleter {
|
||||||
|
/**
|
||||||
|
* Create a new command.
|
||||||
|
*
|
||||||
|
* @param plugin The 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.
|
||||||
|
*/
|
||||||
|
protected PluginCommand(@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final String name,
|
||||||
|
@NotNull final String permission,
|
||||||
|
final boolean playersOnly) {
|
||||||
|
super(plugin, name, permission, playersOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers the command with the server,
|
||||||
|
* <p>
|
||||||
|
* Requires the command name to exist, defined in plugin.yml.
|
||||||
|
*/
|
||||||
|
public final void register() {
|
||||||
|
org.bukkit.command.PluginCommand command = Bukkit.getPluginCommand(this.getName());
|
||||||
|
assert command != null;
|
||||||
|
command.setExecutor(this);
|
||||||
|
command.setTabCompleter(this);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 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
|
||||||
|
public final boolean onCommand(@NotNull final CommandSender sender,
|
||||||
|
@NotNull final Command command,
|
||||||
|
@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
|
||||||
|
public @Nullable List<String> onTabComplete(@NotNull final CommandSender sender,
|
||||||
|
@NotNull final Command command,
|
||||||
|
@NotNull final String label,
|
||||||
|
@NotNull final String[] args) {
|
||||||
|
if (!command.getName().equalsIgnoreCase(this.getName())) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return this.handleTabCompletion(sender, args);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.core.command.impl;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.command.CommandBase;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Subcommands can be added to PluginCommands or to other Subcommands.
|
||||||
|
*/
|
||||||
|
public abstract class Subcommand extends HandledCommand {
|
||||||
|
/**
|
||||||
|
* Create subcommand.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param name The subcommand name.
|
||||||
|
* @param permission The subcommand permission.
|
||||||
|
* @param playersOnly If the subcommand only works on players.
|
||||||
|
*/
|
||||||
|
protected Subcommand(@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final String name,
|
||||||
|
@NotNull final String permission,
|
||||||
|
final boolean playersOnly) {
|
||||||
|
super(plugin, name, permission, playersOnly);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create subcommand.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param name The name of the subcommand.
|
||||||
|
* @param parent The parent command.
|
||||||
|
*/
|
||||||
|
protected Subcommand(@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final String name,
|
||||||
|
@NotNull final CommandBase parent) {
|
||||||
|
super(plugin, name, parent.getPermission(), parent.isPlayersOnly());
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import com.willfp.eco.internal.config.yaml.UpdatableYamlConfig;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public abstract class BaseConfig extends UpdatableYamlConfig {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
|
||||||
* <p>
|
|
||||||
* Automatically updates.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
|
||||||
*/
|
|
||||||
protected BaseConfig(@NotNull final String configName,
|
|
||||||
final boolean removeUnused,
|
|
||||||
@NotNull final EcoPlugin plugin,
|
|
||||||
@NotNull final String... updateBlacklist) {
|
|
||||||
super(configName, plugin, "", plugin.getClass(), removeUnused, updateBlacklist);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
|
||||||
* <p>
|
|
||||||
* Automatically updates.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
|
||||||
* @param plugin The plugin.
|
|
||||||
*/
|
|
||||||
protected BaseConfig(@NotNull final String configName,
|
|
||||||
final boolean removeUnused,
|
|
||||||
@NotNull final EcoPlugin plugin) {
|
|
||||||
super(configName, plugin, "", plugin.getClass(), removeUnused, "");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import java.lang.annotation.ElementType;
|
|
||||||
import java.lang.annotation.Retention;
|
|
||||||
import java.lang.annotation.RetentionPolicy;
|
|
||||||
import java.lang.annotation.Target;
|
|
||||||
|
|
||||||
@Retention(RetentionPolicy.RUNTIME)
|
|
||||||
@Target(ElementType.METHOD)
|
|
||||||
public @interface ConfigUpdater {
|
|
||||||
}
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import com.willfp.eco.internal.config.yaml.UpdatableYamlConfig;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public abstract class ExtendableConfig extends UpdatableYamlConfig {
|
|
||||||
/**
|
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
|
||||||
* <p>
|
|
||||||
* Automatically updates.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
|
||||||
* @param subDirectoryPath The subdirectory path.
|
|
||||||
* @param source The class that owns the resource.
|
|
||||||
*/
|
|
||||||
protected ExtendableConfig(@NotNull final String configName,
|
|
||||||
final boolean removeUnused,
|
|
||||||
@NotNull final EcoPlugin plugin,
|
|
||||||
@NotNull final Class<?> source,
|
|
||||||
@NotNull final String subDirectoryPath,
|
|
||||||
@NotNull final String... updateBlacklist) {
|
|
||||||
super(configName, plugin, subDirectoryPath, source, removeUnused, updateBlacklist);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import com.willfp.eco.internal.config.json.LoadableJsonConfig;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public abstract class JsonStaticBaseConfig extends LoadableJsonConfig {
|
|
||||||
/**
|
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
|
||||||
* <p>
|
|
||||||
* Does not automatically update.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param plugin The plugin.
|
|
||||||
*/
|
|
||||||
protected JsonStaticBaseConfig(@NotNull final String configName,
|
|
||||||
@NotNull final EcoPlugin plugin) {
|
|
||||||
super(configName, plugin, "", plugin.getClass());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import com.willfp.eco.internal.config.yaml.LoadableYamlConfig;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public abstract class StaticBaseConfig extends LoadableYamlConfig {
|
|
||||||
/**
|
|
||||||
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
|
||||||
* <p>
|
|
||||||
* Does not automatically update.
|
|
||||||
*
|
|
||||||
* @param configName The name of the config
|
|
||||||
* @param plugin The plugin.
|
|
||||||
*/
|
|
||||||
protected StaticBaseConfig(@NotNull final String configName,
|
|
||||||
@NotNull final EcoPlugin plugin) {
|
|
||||||
super(configName, plugin, "", plugin.getClass());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
package com.willfp.eco.core.config;
|
|
||||||
|
|
||||||
import com.willfp.eco.internal.config.yaml.YamlConfigWrapper;
|
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
public abstract class YamlConfig extends YamlConfigWrapper<YamlConfiguration> {
|
|
||||||
/**
|
|
||||||
* Config implementation for passing YamlConfigurations.
|
|
||||||
* <p>
|
|
||||||
* Does not automatically update.
|
|
||||||
*
|
|
||||||
* @param config The YamlConfiguration handle.
|
|
||||||
*/
|
|
||||||
public YamlConfig(@NotNull final YamlConfiguration config) {
|
|
||||||
init(config);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.willfp.eco.core.config.base;
|
package com.willfp.eco.core.config.base;
|
||||||
|
|
||||||
import com.willfp.eco.core.config.BaseConfig;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
public class ConfigYml extends BaseConfig {
|
* Default plugin config.yml.
|
||||||
|
*/
|
||||||
|
public class ConfigYml extends YamlBaseConfig {
|
||||||
/**
|
/**
|
||||||
* Config.yml.
|
* Config.yml.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,10 +1,13 @@
|
|||||||
package com.willfp.eco.core.config.base;
|
package com.willfp.eco.core.config.base;
|
||||||
|
|
||||||
import com.willfp.eco.core.config.BaseConfig;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.yaml.YamlBaseConfig;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class LangYml extends BaseConfig {
|
/**
|
||||||
|
* Default plugin lang.yml.
|
||||||
|
*/
|
||||||
|
public class LangYml extends YamlBaseConfig {
|
||||||
/**
|
/**
|
||||||
* Lang.yml.
|
* Lang.yml.
|
||||||
*
|
*
|
||||||
|
|||||||
@@ -1,11 +1,16 @@
|
|||||||
package com.willfp.eco.core.config;
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
public interface Config {
|
/**
|
||||||
|
* All canfigs implement this interface.
|
||||||
|
* <p>
|
||||||
|
* Contains all methods that must exist in yaml and json configurations.
|
||||||
|
*/
|
||||||
|
public interface Config extends Cloneable {
|
||||||
/**
|
/**
|
||||||
* Clears cache.
|
* Clears cache.
|
||||||
*/
|
*/
|
||||||
@@ -162,6 +167,17 @@ public interface Config {
|
|||||||
@NotNull
|
@NotNull
|
||||||
String getString(@NotNull String path);
|
String getString(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a string from config.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param format If the string should be formatted.
|
||||||
|
* @return The found value, or an empty string if not found.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
String getString(@NotNull String path,
|
||||||
|
boolean format);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a string from config.
|
* Get a string from config.
|
||||||
*
|
*
|
||||||
@@ -171,8 +187,21 @@ public interface Config {
|
|||||||
@Nullable
|
@Nullable
|
||||||
String getStringOrNull(@NotNull String path);
|
String getStringOrNull(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a string from config.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param format If the string should be formatted.
|
||||||
|
* @return The found value, or null if not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
String getStringOrNull(@NotNull String path,
|
||||||
|
boolean format);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
|
* <p>
|
||||||
|
* Formatted by default.
|
||||||
*
|
*
|
||||||
* @param path The key to fetch the value from.
|
* @param path The key to fetch the value from.
|
||||||
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
@@ -180,6 +209,17 @@ public interface Config {
|
|||||||
@NotNull
|
@NotNull
|
||||||
List<String> getStrings(@NotNull String path);
|
List<String> getStrings(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of strings from config.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param format If the strings should be formatted.
|
||||||
|
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
|
||||||
|
*/
|
||||||
|
@NotNull
|
||||||
|
List<String> getStrings(@NotNull String path,
|
||||||
|
boolean format);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a list of strings from config.
|
* Get a list of strings from config.
|
||||||
*
|
*
|
||||||
@@ -189,6 +229,17 @@ public interface Config {
|
|||||||
@Nullable
|
@Nullable
|
||||||
List<String> getStringsOrNull(@NotNull String path);
|
List<String> getStringsOrNull(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a list of strings from config.
|
||||||
|
*
|
||||||
|
* @param path The key to fetch the value from.
|
||||||
|
* @param format If the strings should be formatted.
|
||||||
|
* @return The found value, or null if not found.
|
||||||
|
*/
|
||||||
|
@Nullable
|
||||||
|
List<String> getStringsOrNull(@NotNull String path,
|
||||||
|
boolean format);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get a decimal from config.
|
* Get a decimal from config.
|
||||||
*
|
*
|
||||||
@@ -223,4 +274,11 @@ public interface Config {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
List<Double> getDoublesOrNull(@NotNull String path);
|
List<Double> getDoublesOrNull(@NotNull String path);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clone the config.
|
||||||
|
*
|
||||||
|
* @return The clone.
|
||||||
|
*/
|
||||||
|
Config clone();
|
||||||
}
|
}
|
||||||
@@ -1,10 +1,15 @@
|
|||||||
package com.willfp.eco.core.config;
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON configs have extra methods compared to yaml configs.
|
||||||
|
* <p>
|
||||||
|
* If you need to use them, then use JSONConfig instead.
|
||||||
|
*/
|
||||||
public interface JSONConfig extends Config {
|
public interface JSONConfig extends Config {
|
||||||
/**
|
/**
|
||||||
* Get a list of subsections from config.
|
* Get a list of subsections from config.
|
||||||
@@ -23,4 +28,7 @@ public interface JSONConfig extends Config {
|
|||||||
*/
|
*/
|
||||||
@Nullable
|
@Nullable
|
||||||
List<JSONConfig> getSubsectionsOrNull(@NotNull String path);
|
List<JSONConfig> getSubsectionsOrNull(@NotNull String path);
|
||||||
|
|
||||||
|
@Override
|
||||||
|
JSONConfig clone();
|
||||||
}
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
package com.willfp.eco.internal.config;
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for configs that physically exist as files in plugins.
|
||||||
|
*/
|
||||||
public interface LoadableConfig {
|
public interface LoadableConfig {
|
||||||
/**
|
/**
|
||||||
* Create the file.
|
* Create the file.
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.willfp.eco.core.config.interfaces;
|
||||||
|
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for configs that wrap an {@link YamlConfiguration}.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper
|
||||||
|
*/
|
||||||
|
public interface WrappedYamlConfiguration {
|
||||||
|
/**
|
||||||
|
* Get the ConfigurationSection handle.
|
||||||
|
*
|
||||||
|
* @return The handle.
|
||||||
|
*/
|
||||||
|
YamlConfiguration getBukkitHandle();
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.willfp.eco.core.config.json;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-updatable JSON config that exists within a plugin jar.
|
||||||
|
*/
|
||||||
|
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
|
||||||
|
* <p>
|
||||||
|
* Does not automatically update.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
*/
|
||||||
|
protected JSONStaticBaseConfig(@NotNull final String configName,
|
||||||
|
@NotNull final EcoPlugin plugin) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createLoadableJSONConfig(configName, plugin, "", plugin.getClass()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.willfp.eco.core.config.json;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Raw JSON config with a map of values at its core.
|
||||||
|
*/
|
||||||
|
public class JSONTransientConfig extends JSONConfigWrapper {
|
||||||
|
/**
|
||||||
|
* Config implementation for passing maps.
|
||||||
|
* <p>
|
||||||
|
* Does not automatically update.
|
||||||
|
*
|
||||||
|
* @param values The map of values.
|
||||||
|
*/
|
||||||
|
public JSONTransientConfig(@NotNull final Map<String, Object> values) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createJSONConfig(values));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.core.config.json.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
|
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to handle the backend JSON config implementations.
|
||||||
|
*/
|
||||||
|
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The handle.
|
||||||
|
*/
|
||||||
|
protected JSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||||
|
super(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<JSONConfig> getSubsections(@NotNull final String path) {
|
||||||
|
return this.getHandle().getSubsections(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<JSONConfig> getSubsectionsOrNull(@NotNull final String path) {
|
||||||
|
return this.getHandle().getSubsectionsOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public JSONConfig clone() {
|
||||||
|
return this.getHandle().clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.willfp.eco.core.config.json.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to handle the backend loadable JSON config implementations.
|
||||||
|
*/
|
||||||
|
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The handle.
|
||||||
|
*/
|
||||||
|
protected LoadableJSONConfigWrapper(@NotNull final JSONConfig handle) {
|
||||||
|
super(handle);
|
||||||
|
|
||||||
|
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createFile() {
|
||||||
|
((LoadableConfig) this.getHandle()).createFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getResourcePath() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() throws IOException {
|
||||||
|
((LoadableConfig) this.getHandle()).save();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getConfigFile() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.core.config.updating;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Every {@link com.willfp.eco.core.EcoPlugin} has a config handler.
|
||||||
|
* <p>
|
||||||
|
* Handles updating and saving configs.
|
||||||
|
*/
|
||||||
|
public interface ConfigHandler {
|
||||||
|
/**
|
||||||
|
* Invoke all update methods.
|
||||||
|
*/
|
||||||
|
void callUpdate();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save all configs.
|
||||||
|
*/
|
||||||
|
void saveAllConfigs();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update all updatable configs.
|
||||||
|
*/
|
||||||
|
void updateConfigs();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add new config to be saved.
|
||||||
|
*
|
||||||
|
* @param config The config.
|
||||||
|
*/
|
||||||
|
void addConfig(@NotNull LoadableConfig config);
|
||||||
|
}
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
package com.willfp.eco.core.config.updating;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Annotation to put on update methods.
|
||||||
|
* <p>
|
||||||
|
* All update methods must be public and static,
|
||||||
|
* and can accept an EcoPlugin as a parameter.
|
||||||
|
* <p>
|
||||||
|
* As such, there are only 2 valid update methods:
|
||||||
|
* <p>
|
||||||
|
* The first:
|
||||||
|
* <pre>{@code
|
||||||
|
* @ConfigUpdater
|
||||||
|
* public static void update() {
|
||||||
|
* // Update code
|
||||||
|
* }
|
||||||
|
* }</pre>
|
||||||
|
* <p>
|
||||||
|
* The second:
|
||||||
|
* <pre>{@code
|
||||||
|
* public static void update(EcoPlugin plugin) {}
|
||||||
|
* // Update code
|
||||||
|
* }</pre>
|
||||||
|
* <p>
|
||||||
|
* Config update methods in all classes in a plugin jar will be called
|
||||||
|
* on reload.
|
||||||
|
* <p>
|
||||||
|
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
||||||
|
* calls in your code.
|
||||||
|
*/
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
public @interface ConfigUpdater {
|
||||||
|
}
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
package com.willfp.eco.core.config.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import com.willfp.eco.core.config.interfaces.JSONConfig;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal component to create backend config implementations.
|
||||||
|
*/
|
||||||
|
public interface ConfigFactory {
|
||||||
|
/**
|
||||||
|
* Updatable config.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param subDirectoryPath The subdirectory path.
|
||||||
|
* @param source The class that owns the resource.
|
||||||
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
|
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
Config createUpdatableYamlConfig(@NotNull String configName,
|
||||||
|
@NotNull EcoPlugin plugin,
|
||||||
|
@NotNull String subDirectoryPath,
|
||||||
|
@NotNull Class<?> source,
|
||||||
|
boolean removeUnused,
|
||||||
|
@NotNull String... updateBlacklist);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON loadable config.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param subDirectoryPath The subdirectory path.
|
||||||
|
* @param source The class that owns the resource.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
JSONConfig createLoadableJSONConfig(@NotNull String configName,
|
||||||
|
@NotNull EcoPlugin plugin,
|
||||||
|
@NotNull String subDirectoryPath,
|
||||||
|
@NotNull Class<?> source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Yaml loadable config.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param subDirectoryPath The subdirectory path.
|
||||||
|
* @param source The class that owns the resource.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
Config createLoadableYamlConfig(@NotNull String configName,
|
||||||
|
@NotNull EcoPlugin plugin,
|
||||||
|
@NotNull String subDirectoryPath,
|
||||||
|
@NotNull Class<?> source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Yaml config.
|
||||||
|
*
|
||||||
|
* @param config The handle.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
Config createYamlConfig(@NotNull YamlConfiguration config);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* JSON config.
|
||||||
|
*
|
||||||
|
* @param values The values.
|
||||||
|
* @return The config implementation.
|
||||||
|
*/
|
||||||
|
JSONConfig createJSONConfig(@NotNull Map<String, Object> values);
|
||||||
|
}
|
||||||
@@ -0,0 +1,196 @@
|
|||||||
|
package com.willfp.eco.core.config.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configs from eco have an internal implementation,
|
||||||
|
* which is the handle.
|
||||||
|
* <p>
|
||||||
|
* This class handles them.
|
||||||
|
*
|
||||||
|
* @param <T> The type of the handle.
|
||||||
|
*/
|
||||||
|
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||||
|
/**
|
||||||
|
* Configs from eco have an internal implementation,
|
||||||
|
* which is the handle.
|
||||||
|
* <p>
|
||||||
|
* The handle should only ever be used if you want to
|
||||||
|
* do something <i>interesting</i> config-wise with some
|
||||||
|
* internals.
|
||||||
|
* <p>
|
||||||
|
* In general use, though, the handle isn't necessary.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final T handle;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The config that is being wrapped.
|
||||||
|
*/
|
||||||
|
protected ConfigWrapper(@NotNull final T handle) {
|
||||||
|
this.handle = handle;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void clearCache() {
|
||||||
|
handle.clearCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toPlaintext() {
|
||||||
|
return handle.toPlaintext();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean has(@NotNull final String path) {
|
||||||
|
return handle.has(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<String> getKeys(final boolean deep) {
|
||||||
|
return handle.getKeys(deep);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Object get(@NotNull final String path) {
|
||||||
|
return handle.get(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void set(@NotNull final String path,
|
||||||
|
@Nullable final Object object) {
|
||||||
|
handle.set(path, object);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull Config getSubsection(@NotNull final String path) {
|
||||||
|
return handle.getSubsection(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Config getSubsectionOrNull(@NotNull final String path) {
|
||||||
|
return handle.getSubsectionOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInt(@NotNull final String path) {
|
||||||
|
return handle.getInt(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Integer getIntOrNull(@NotNull final String path) {
|
||||||
|
return handle.getIntOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getInt(@NotNull final String path,
|
||||||
|
final int def) {
|
||||||
|
return handle.getInt(path, def);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<Integer> getInts(@NotNull final String path) {
|
||||||
|
return handle.getInts(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<Integer> getIntsOrNull(@NotNull final String path) {
|
||||||
|
return handle.getIntsOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean getBool(@NotNull final String path) {
|
||||||
|
return handle.getBool(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Boolean getBoolOrNull(@NotNull final String path) {
|
||||||
|
return handle.getBoolOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<Boolean> getBools(@NotNull final String path) {
|
||||||
|
return handle.getBools(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<Boolean> getBoolsOrNull(@NotNull final String path) {
|
||||||
|
return handle.getBoolsOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getString(@NotNull final String path) {
|
||||||
|
return handle.getString(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull String getString(@NotNull final String path,
|
||||||
|
final boolean format) {
|
||||||
|
return handle.getString(path, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getStringOrNull(@NotNull final String path) {
|
||||||
|
return handle.getStringOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable String getStringOrNull(@NotNull final String path,
|
||||||
|
final boolean format) {
|
||||||
|
return handle.getStringOrNull(path, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<String> getStrings(@NotNull final String path) {
|
||||||
|
return handle.getStrings(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<String> getStrings(@NotNull final String path,
|
||||||
|
final boolean format) {
|
||||||
|
return handle.getStrings(path, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<String> getStringsOrNull(@NotNull final String path) {
|
||||||
|
return handle.getStringsOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<String> getStringsOrNull(@NotNull final String path,
|
||||||
|
final boolean format) {
|
||||||
|
return handle.getStringsOrNull(path, format);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public double getDouble(@NotNull final String path) {
|
||||||
|
return handle.getDouble(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable Double getDoubleOrNull(@NotNull final String path) {
|
||||||
|
return handle.getDoubleOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @NotNull List<Double> getDoubles(@NotNull final String path) {
|
||||||
|
return handle.getDoubles(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public @Nullable List<Double> getDoublesOrNull(@NotNull final String path) {
|
||||||
|
return handle.getDoublesOrNull(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Config clone() {
|
||||||
|
return handle.clone();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
|
* <p>
|
||||||
|
* Automatically updates.
|
||||||
|
*/
|
||||||
|
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
|
||||||
|
/**
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||||
|
*/
|
||||||
|
protected YamlBaseConfig(@NotNull final String configName,
|
||||||
|
final boolean removeUnused,
|
||||||
|
@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final String... updateBlacklist) {
|
||||||
|
super(
|
||||||
|
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
"",
|
||||||
|
plugin.getClass(),
|
||||||
|
removeUnused, updateBlacklist
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
|
* @param plugin The plugin.
|
||||||
|
*/
|
||||||
|
protected YamlBaseConfig(@NotNull final String configName,
|
||||||
|
final boolean removeUnused,
|
||||||
|
@NotNull final EcoPlugin plugin) {
|
||||||
|
super(
|
||||||
|
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
"",
|
||||||
|
plugin.getClass(),
|
||||||
|
removeUnused
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in one of two places:
|
||||||
|
* <ul>
|
||||||
|
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||||
|
* <li>Other extension's configs</li>
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* Automatically updates.
|
||||||
|
*/
|
||||||
|
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
|
||||||
|
/**
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param removeUnused Whether keys not present in the default config should be removed on update.
|
||||||
|
* @param plugin The plugin.
|
||||||
|
* @param updateBlacklist Substring of keys to not add/remove keys for.
|
||||||
|
* @param subDirectoryPath The subdirectory path.
|
||||||
|
* @param source The class that owns the resource.
|
||||||
|
*/
|
||||||
|
protected YamlExtendableConfig(@NotNull final String configName,
|
||||||
|
final boolean removeUnused,
|
||||||
|
@NotNull final EcoPlugin plugin,
|
||||||
|
@NotNull final Class<?> source,
|
||||||
|
@NotNull final String subDirectoryPath,
|
||||||
|
@NotNull final String... updateBlacklist) {
|
||||||
|
super(
|
||||||
|
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig(
|
||||||
|
configName,
|
||||||
|
plugin,
|
||||||
|
subDirectoryPath,
|
||||||
|
source,
|
||||||
|
removeUnused,
|
||||||
|
updateBlacklist
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,24 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Non-updatable yaml config that exists within a plugin jar.
|
||||||
|
*/
|
||||||
|
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
|
||||||
|
/**
|
||||||
|
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
|
||||||
|
* <p>
|
||||||
|
* Does not automatically update.
|
||||||
|
*
|
||||||
|
* @param configName The name of the config
|
||||||
|
* @param plugin The plugin.
|
||||||
|
*/
|
||||||
|
protected YamlStaticBaseConfig(@NotNull final String configName,
|
||||||
|
@NotNull final EcoPlugin plugin) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createLoadableYamlConfig(configName, plugin, "", plugin.getClass()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
|
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.io.StringReader;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config implementation for passing YamlConfigurations.
|
||||||
|
* <p>
|
||||||
|
* Does not automatically update.
|
||||||
|
*/
|
||||||
|
public class YamlTransientConfig extends YamlConfigWrapper {
|
||||||
|
/**
|
||||||
|
* @param config The YamlConfiguration handle.
|
||||||
|
*/
|
||||||
|
public YamlTransientConfig(@NotNull final YamlConfiguration config) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createYamlConfig(config));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param contents The contents of the config.
|
||||||
|
*/
|
||||||
|
public YamlTransientConfig(@NotNull final String contents) {
|
||||||
|
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader(contents))));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,51 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import com.willfp.eco.core.config.interfaces.LoadableConfig;
|
||||||
|
import org.apache.commons.lang.Validate;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to handle the backend loadable yaml config implementations.
|
||||||
|
*/
|
||||||
|
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The handle.
|
||||||
|
*/
|
||||||
|
protected LoadableYamlConfigWrapper(@NotNull final Config handle) {
|
||||||
|
super(handle);
|
||||||
|
|
||||||
|
Validate.isTrue(handle instanceof LoadableConfig, "Wrapped config must be loadable!");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void createFile() {
|
||||||
|
((LoadableConfig) this.getHandle()).createFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getResourcePath() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getResourcePath();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void save() throws IOException {
|
||||||
|
((LoadableConfig) this.getHandle()).save();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public File getConfigFile() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getConfigFile();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getName() {
|
||||||
|
return ((LoadableConfig) this.getHandle()).getName();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,27 @@
|
|||||||
|
package com.willfp.eco.core.config.yaml.wrapper;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.config.interfaces.Config;
|
||||||
|
import com.willfp.eco.core.config.interfaces.WrappedYamlConfiguration;
|
||||||
|
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
|
||||||
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper to handle the backend yaml config implementations.
|
||||||
|
*/
|
||||||
|
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
|
||||||
|
/**
|
||||||
|
* Create a config wrapper.
|
||||||
|
*
|
||||||
|
* @param handle The handle.
|
||||||
|
*/
|
||||||
|
protected YamlConfigWrapper(@NotNull final Config handle) {
|
||||||
|
super(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public YamlConfiguration getBukkitHandle() {
|
||||||
|
return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
package com.willfp.eco.core.data;
|
|
||||||
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
|
||||||
import com.willfp.eco.core.config.Config;
|
|
||||||
import com.willfp.eco.core.config.JSONConfig;
|
|
||||||
import com.willfp.eco.core.config.JsonStaticBaseConfig;
|
|
||||||
import com.willfp.eco.internal.config.LoadableConfig;
|
|
||||||
import com.willfp.eco.internal.config.json.JSONConfigSection;
|
|
||||||
import lombok.experimental.UtilityClass;
|
|
||||||
import org.bukkit.OfflinePlayer;
|
|
||||||
import org.jetbrains.annotations.ApiStatus;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
@UtilityClass
|
|
||||||
public class Data {
|
|
||||||
/**
|
|
||||||
* Instance of eco data.yml.
|
|
||||||
*/
|
|
||||||
private static JSONConfig datafile = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* All cached player data.
|
|
||||||
*/
|
|
||||||
private static final Map<UUID, Map<EcoPlugin, JSONConfig>> PLAYER_DATA = new HashMap<>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Initialize the player data with an instance of data.json.
|
|
||||||
*
|
|
||||||
* @param config data.json.
|
|
||||||
*/
|
|
||||||
@ApiStatus.Internal
|
|
||||||
public void init(@NotNull final JsonStaticBaseConfig config) {
|
|
||||||
datafile = config;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save to data.yml.
|
|
||||||
*
|
|
||||||
* @param config Instance of data.yml.
|
|
||||||
* @throws IOException Error during saving.
|
|
||||||
*/
|
|
||||||
@ApiStatus.Internal
|
|
||||||
public void save(@NotNull final Config config) throws IOException {
|
|
||||||
for (Map.Entry<UUID, Map<EcoPlugin, JSONConfig>> entry : PLAYER_DATA.entrySet()) {
|
|
||||||
entry.getValue().forEach((plugin, jsonConfig) -> {
|
|
||||||
for (String key : jsonConfig.getKeys(false)) {
|
|
||||||
config.set("player-data." + plugin.getName().toLowerCase() + "." + entry.getKey().toString() + "." + key, jsonConfig);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
((LoadableConfig) config).save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the data for a player.
|
|
||||||
*
|
|
||||||
* @param player The player.
|
|
||||||
* @param plugin The plugin.
|
|
||||||
* @return The data.
|
|
||||||
*/
|
|
||||||
public JSONConfig getData(@NotNull final OfflinePlayer player,
|
|
||||||
@NotNull final EcoPlugin plugin) {
|
|
||||||
if (!PLAYER_DATA.containsKey(player.getUniqueId())) {
|
|
||||||
PLAYER_DATA.put(player.getUniqueId(), new HashMap<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
JSONConfig config = PLAYER_DATA.get(player.getUniqueId()).get(plugin);
|
|
||||||
|
|
||||||
if (config == null) {
|
|
||||||
config = (JSONConfig) datafile.getSubsectionOrNull("player-data." + plugin.getName().toLowerCase() + "." + player.getUniqueId());
|
|
||||||
if (config == null) {
|
|
||||||
config = new JSONConfigSection(new HashMap<>());
|
|
||||||
}
|
|
||||||
PLAYER_DATA.get(player.getUniqueId()).put(plugin, config);
|
|
||||||
return getData(player, plugin);
|
|
||||||
}
|
|
||||||
|
|
||||||
return config;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -15,10 +15,13 @@ import java.util.HashMap;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to manage client-side item display.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class Display {
|
public class Display {
|
||||||
/**
|
/**
|
||||||
* The prefix for lore lines.
|
* The prefix for client-side lore lines.
|
||||||
*/
|
*/
|
||||||
public static final String PREFIX = "§z";
|
public static final String PREFIX = "§z";
|
||||||
|
|
||||||
@@ -51,7 +54,7 @@ public class Display {
|
|||||||
* Display on ItemStacks.
|
* Display on ItemStacks.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The itemstack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public ItemStack display(@NotNull final ItemStack itemStack) {
|
public ItemStack display(@NotNull final ItemStack itemStack) {
|
||||||
if (!itemStack.hasItemMeta()) {
|
if (!itemStack.hasItemMeta()) {
|
||||||
@@ -90,7 +93,7 @@ public class Display {
|
|||||||
* Display on ItemStacks and then finalize.
|
* Display on ItemStacks and then finalize.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The itemstack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
|
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
|
||||||
return finalize(display(itemStack));
|
return finalize(display(itemStack));
|
||||||
@@ -100,7 +103,7 @@ public class Display {
|
|||||||
* Revert on ItemStacks.
|
* Revert on ItemStacks.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The itemstack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public ItemStack revert(@NotNull final ItemStack itemStack) {
|
public ItemStack revert(@NotNull final ItemStack itemStack) {
|
||||||
if (Display.isFinalized(itemStack)) {
|
if (Display.isFinalized(itemStack)) {
|
||||||
@@ -138,7 +141,7 @@ public class Display {
|
|||||||
* Finalize an ItemStacks.
|
* Finalize an ItemStacks.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The itemstack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public ItemStack finalize(@NotNull final ItemStack itemStack) {
|
public ItemStack finalize(@NotNull final ItemStack itemStack) {
|
||||||
Validate.notNull(finalizeKey, "Key cannot be null!");
|
Validate.notNull(finalizeKey, "Key cannot be null!");
|
||||||
@@ -162,7 +165,7 @@ public class Display {
|
|||||||
* Unfinalize an ItemStacks.
|
* Unfinalize an ItemStacks.
|
||||||
*
|
*
|
||||||
* @param itemStack The item.
|
* @param itemStack The item.
|
||||||
* @return The itemstack.
|
* @return The ItemStack.
|
||||||
*/
|
*/
|
||||||
public ItemStack unfinalize(@NotNull final ItemStack itemStack) {
|
public ItemStack unfinalize(@NotNull final ItemStack itemStack) {
|
||||||
Validate.notNull(finalizeKey, "Key cannot be null!");
|
Validate.notNull(finalizeKey, "Key cannot be null!");
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package com.willfp.eco.core.display;
|
package com.willfp.eco.core.display;
|
||||||
|
|
||||||
import com.willfp.eco.core.PluginDependent;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import com.willfp.eco.core.PluginDependent;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public abstract class DisplayModule extends PluginDependent {
|
/**
|
||||||
|
* Class for all plugin-specific client-side item display modules.
|
||||||
|
*/
|
||||||
|
public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||||
/**
|
/**
|
||||||
* The priority of the module.
|
* The priority of the module.
|
||||||
*/
|
*/
|
||||||
@@ -46,7 +49,7 @@ public abstract class DisplayModule extends PluginDependent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create varargs to pass back to itemstack after reverting, but before display.
|
* Create varargs to pass back to ItemStack after reverting, but before display.
|
||||||
*
|
*
|
||||||
* @param itemStack The itemStack.
|
* @param itemStack The itemStack.
|
||||||
* @return The plugin-specific varargs.
|
* @return The plugin-specific varargs.
|
||||||
@@ -60,7 +63,7 @@ public abstract class DisplayModule extends PluginDependent {
|
|||||||
*
|
*
|
||||||
* @return The plugin name.
|
* @return The plugin name.
|
||||||
*/
|
*/
|
||||||
final String getPluginName() {
|
public final String getPluginName() {
|
||||||
return super.getPlugin().getPluginName();
|
return super.getPlugin().getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,8 @@
|
|||||||
package com.willfp.eco.core.display;
|
package com.willfp.eco.core.display;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The priority (order) of display modules.
|
||||||
|
*/
|
||||||
public enum DisplayPriority {
|
public enum DisplayPriority {
|
||||||
/**
|
/**
|
||||||
* Ran first.
|
* Ran first.
|
||||||
|
|||||||
@@ -1,10 +1,6 @@
|
|||||||
package com.willfp.eco.core.drops;
|
package com.willfp.eco.core.drops;
|
||||||
|
|
||||||
import com.willfp.eco.internal.drops.AbstractDropQueue;
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.internal.drops.DropManager;
|
|
||||||
import com.willfp.eco.internal.drops.DropQueueType;
|
|
||||||
import com.willfp.eco.internal.drops.impl.FastCollatedDropQueue;
|
|
||||||
import com.willfp.eco.internal.drops.impl.InternalDropQueue;
|
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
@@ -12,21 +8,26 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
|
||||||
public class DropQueue {
|
|
||||||
/**
|
/**
|
||||||
* The internally used {@link AbstractDropQueue}.
|
* A {@link DropQueue} is a set of drops linked to player.
|
||||||
*/
|
|
||||||
private final AbstractDropQueue handle;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create {@link DropQueue} linked to player.
|
|
||||||
* <p>
|
* <p>
|
||||||
* All drops should be passed through a drop queue for telekinesis integration.
|
* All drops should be passed through a drop queue for telekinesis integration.
|
||||||
|
* <p>
|
||||||
|
* It functions essentially as a builder class, and runs very quickly.
|
||||||
*
|
*
|
||||||
|
* @see com.willfp.eco.util.TelekinesisUtils
|
||||||
|
*/
|
||||||
|
public class DropQueue {
|
||||||
|
/**
|
||||||
|
* The internally used {@link DropQueue}.
|
||||||
|
*/
|
||||||
|
private final DropQueue handle;
|
||||||
|
|
||||||
|
/**
|
||||||
* @param player The player.
|
* @param player The player.
|
||||||
*/
|
*/
|
||||||
public DropQueue(@NotNull final Player player) {
|
public DropQueue(@NotNull final Player player) {
|
||||||
handle = DropManager.getType() == DropQueueType.COLLATED ? new FastCollatedDropQueue(player) : new InternalDropQueue(player);
|
handle = Eco.getHandler().getDropQueueFactory().create(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.willfp.eco.core.drops;
|
||||||
|
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal component to create backend DropQueue implementations.
|
||||||
|
*/
|
||||||
|
public interface DropQueueFactory {
|
||||||
|
/**
|
||||||
|
* Create a DropQueue.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
* @return The Queue.
|
||||||
|
*/
|
||||||
|
DropQueue create(@NotNull Player player);
|
||||||
|
}
|
||||||
@@ -5,10 +5,23 @@ import org.bukkit.event.HandlerList;
|
|||||||
import org.bukkit.event.player.PlayerEvent;
|
import org.bukkit.event.player.PlayerEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The armor equip event <b>does not contain information about the event.</b>
|
||||||
|
* <p>
|
||||||
|
* It is purely a trigger called whenever a player changes armor, you have to run
|
||||||
|
* your own checks.
|
||||||
|
* <p>
|
||||||
|
* The event is called before the player's inventory actually updates,
|
||||||
|
* so you can check a tick later to see the new contents.
|
||||||
|
*/
|
||||||
public class ArmorEquipEvent extends PlayerEvent {
|
public class ArmorEquipEvent extends PlayerEvent {
|
||||||
private static final HandlerList HANDLERS = new HandlerList();
|
private static final HandlerList HANDLERS = new HandlerList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new ArmorEquipEvent.
|
||||||
|
*
|
||||||
|
* @param player The player.
|
||||||
|
*/
|
||||||
public ArmorEquipEvent(@NotNull final Player player) {
|
public ArmorEquipEvent(@NotNull final Player player) {
|
||||||
super(player);
|
super(player);
|
||||||
}
|
}
|
||||||
@@ -25,6 +38,11 @@ public class ArmorEquipEvent extends PlayerEvent {
|
|||||||
return HANDLERS;
|
return HANDLERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bukkit parity.
|
||||||
|
*
|
||||||
|
* @return The handler list.
|
||||||
|
*/
|
||||||
public static HandlerList getHandlerList() {
|
public static HandlerList getHandlerList() {
|
||||||
return HANDLERS;
|
return HANDLERS;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -12,7 +12,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Event triggered when entity is killed by entity.
|
* Event called when an entity is killed by another entity.
|
||||||
|
* <p>
|
||||||
|
* Not sure why spigot doesn't have this event normally.
|
||||||
*/
|
*/
|
||||||
public class EntityDeathByEntityEvent extends Event {
|
public class EntityDeathByEntityEvent extends Event {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -2,6 +2,9 @@ package com.willfp.eco.core.events;
|
|||||||
|
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Manages listeners for a plugin.
|
||||||
|
*/
|
||||||
public interface EventManager {
|
public interface EventManager {
|
||||||
/**
|
/**
|
||||||
* Register a listener with bukkit.
|
* Register a listener with bukkit.
|
||||||
|
|||||||
@@ -6,6 +6,10 @@ import org.bukkit.event.HandlerList;
|
|||||||
import org.bukkit.event.player.PlayerExpChangeEvent;
|
import org.bukkit.event.player.PlayerExpChangeEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event similar to {@link PlayerExpChangeEvent}, except it
|
||||||
|
* isn't called if the exp is from a bottle.
|
||||||
|
*/
|
||||||
public class NaturalExpGainEvent extends Event {
|
public class NaturalExpGainEvent extends Event {
|
||||||
/**
|
/**
|
||||||
* Internal bukkit.
|
* Internal bukkit.
|
||||||
|
|||||||
@@ -1,15 +1,25 @@
|
|||||||
package com.willfp.eco.core.events;
|
package com.willfp.eco.core.events;
|
||||||
|
|
||||||
|
import org.bukkit.Location;
|
||||||
import org.bukkit.event.HandlerList;
|
import org.bukkit.event.HandlerList;
|
||||||
import org.bukkit.event.player.PlayerMoveEvent;
|
import org.bukkit.event.player.PlayerMoveEvent;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Event called when a player jumps.
|
||||||
|
*/
|
||||||
public class PlayerJumpEvent extends PlayerMoveEvent {
|
public class PlayerJumpEvent extends PlayerMoveEvent {
|
||||||
/**
|
/**
|
||||||
* Internal bukkit.
|
* Internal bukkit.
|
||||||
*/
|
*/
|
||||||
private static final HandlerList HANDLERS = new HandlerList();
|
private static final HandlerList HANDLERS = new HandlerList();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The handled event.
|
||||||
|
*/
|
||||||
|
private final PlayerMoveEvent handle;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a new PlayerJumpEvent.
|
* Create a new PlayerJumpEvent.
|
||||||
*
|
*
|
||||||
@@ -17,6 +27,8 @@ public class PlayerJumpEvent extends PlayerMoveEvent {
|
|||||||
*/
|
*/
|
||||||
public PlayerJumpEvent(@NotNull final PlayerMoveEvent event) {
|
public PlayerJumpEvent(@NotNull final PlayerMoveEvent event) {
|
||||||
super(event.getPlayer(), event.getFrom(), event.getTo());
|
super(event.getPlayer(), event.getFrom(), event.getTo());
|
||||||
|
|
||||||
|
this.handle = event;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -37,4 +49,36 @@ public class PlayerJumpEvent extends PlayerMoveEvent {
|
|||||||
public static @NotNull HandlerList getHandlerList() {
|
public static @NotNull HandlerList getHandlerList() {
|
||||||
return HANDLERS;
|
return HANDLERS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean isCancelled() {
|
||||||
|
return handle.isCancelled();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setCancelled(final boolean cancel) {
|
||||||
|
handle.setCancelled(cancel);
|
||||||
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
|
@Override
|
||||||
|
public Location getFrom() {
|
||||||
|
return handle.getFrom();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setFrom(@NotNull final Location from) {
|
||||||
|
handle.setFrom(from);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Location getTo() {
|
||||||
|
return handle.getTo();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setTo(@NotNull final Location to) {
|
||||||
|
handle.setTo(to);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,12 +1,22 @@
|
|||||||
package com.willfp.eco.core.extensions;
|
package com.willfp.eco.core.extensions;
|
||||||
|
|
||||||
import com.willfp.eco.internal.extensions.ExtensionMetadata;
|
|
||||||
import com.willfp.eco.core.EcoPlugin;
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.apache.commons.lang.Validate;
|
import org.apache.commons.lang.Validate;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An extension is a separate jar file that hooks into the base plugin jar.
|
||||||
|
* <p>
|
||||||
|
* If you take PlaceholderAPI as an example, the PAPI expansions are identical to
|
||||||
|
* extensions.
|
||||||
|
* <p>
|
||||||
|
* Syntactically, extensions are very similar to plugins in their own right, except that
|
||||||
|
* they are loaded by another plugin.
|
||||||
|
*
|
||||||
|
* @see <a href="https://ecoenchants.polymart.org">EcoEnchants extension examples.</a>
|
||||||
|
*/
|
||||||
public abstract class Extension {
|
public abstract class Extension {
|
||||||
/**
|
/**
|
||||||
* The {@link EcoPlugin} that this extension is for.
|
* The {@link EcoPlugin} that this extension is for.
|
||||||
@@ -71,7 +81,17 @@ public abstract class Extension {
|
|||||||
*/
|
*/
|
||||||
public final String getName() {
|
public final String getName() {
|
||||||
Validate.notNull(metadata, "Metadata cannot be null!");
|
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||||
return this.metadata.getName();
|
return this.metadata.name();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the author of the extension.
|
||||||
|
*
|
||||||
|
* @return The author of the metadata attached to the extension.
|
||||||
|
*/
|
||||||
|
public final String getAuthor() {
|
||||||
|
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||||
|
return this.metadata.author();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -81,6 +101,6 @@ public abstract class Extension {
|
|||||||
*/
|
*/
|
||||||
public final String getVersion() {
|
public final String getVersion() {
|
||||||
Validate.notNull(metadata, "Metadata cannot be null!");
|
Validate.notNull(metadata, "Metadata cannot be null!");
|
||||||
return this.metadata.getVersion();
|
return this.metadata.version();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,11 +3,9 @@ package com.willfp.eco.core.extensions;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Interface for extension loader.
|
* Internal component to manage loading and unloading extensions.
|
||||||
* Some external plugins may modify extension loading for internal server purposes.
|
|
||||||
*/
|
*/
|
||||||
public interface ExtensionLoader {
|
public interface ExtensionLoader {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Load all extensions.
|
* Load all extensions.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
package com.willfp.eco.core.extensions;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The extension's metadata.
|
||||||
|
* <p>
|
||||||
|
* Stored as a record internally.
|
||||||
|
*
|
||||||
|
* @param version The extension version.
|
||||||
|
* @param name The extension name.
|
||||||
|
* @param author The extension's author.
|
||||||
|
*/
|
||||||
|
public record ExtensionMetadata(@NotNull String version,
|
||||||
|
@NotNull String name,
|
||||||
|
@NotNull String author) {
|
||||||
|
|
||||||
|
}
|
||||||
@@ -3,16 +3,13 @@ package com.willfp.eco.core.extensions;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called when the extension is made incorrectly.
|
|
||||||
*/
|
|
||||||
public class MalformedExtensionException extends RuntimeException {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Create a new MalformedExtensionException.
|
|
||||||
* <p>
|
|
||||||
* Potential causes include:
|
* Potential causes include:
|
||||||
* Missing or invalid extension.yml.
|
* Missing or invalid extension.yml.
|
||||||
* Invalid filetype.
|
* Invalid filetype.
|
||||||
|
*/
|
||||||
|
public class MalformedExtensionException extends RuntimeException {
|
||||||
|
/**
|
||||||
|
* Create a new MalformedExtensionException.
|
||||||
*
|
*
|
||||||
* @param errorMessage The error message to show.
|
* @param errorMessage The error message to show.
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.willfp.eco.core.factory;
|
|||||||
import org.bukkit.metadata.FixedMetadataValue;
|
import org.bukkit.metadata.FixedMetadataValue;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory to create metadata values for a specific plugin.
|
||||||
|
*/
|
||||||
public interface MetadataValueFactory {
|
public interface MetadataValueFactory {
|
||||||
/**
|
/**
|
||||||
* Create a metadata value for a given plugin and object.
|
* Create a metadata value for a given plugin and object.
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.willfp.eco.core.factory;
|
|||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory to create {@link NamespacedKey}s for a plugin.
|
||||||
|
*/
|
||||||
public interface NamespacedKeyFactory {
|
public interface NamespacedKeyFactory {
|
||||||
/**
|
/**
|
||||||
* Create an {@link NamespacedKey} associated with an {@link com.willfp.eco.core.EcoPlugin}.
|
* Create an {@link NamespacedKey} associated with an {@link com.willfp.eco.core.EcoPlugin}.
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.function.Consumer;
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory to create runnables. Much cleaner syntax than instantiating
|
||||||
|
* {@link org.bukkit.scheduler.BukkitRunnable}s.
|
||||||
|
*/
|
||||||
public interface RunnableFactory {
|
public interface RunnableFactory {
|
||||||
/**
|
/**
|
||||||
* Create a {@link RunnableTask}.
|
* Create a {@link RunnableTask}.
|
||||||
|
|||||||
@@ -0,0 +1,31 @@
|
|||||||
|
package com.willfp.eco.core.gui;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.gui.menu.MenuBuilder;
|
||||||
|
import com.willfp.eco.core.gui.slot.SlotBuilder;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Internal component used by {@link com.willfp.eco.core.gui.menu.Menu#builder(int)}
|
||||||
|
* and {@link com.willfp.eco.core.gui.slot.Slot#builder(ItemStack)}.
|
||||||
|
*/
|
||||||
|
public interface GUIFactory {
|
||||||
|
/**
|
||||||
|
* Create slot builder.
|
||||||
|
*
|
||||||
|
* @param provider The provider.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder createSlotBuilder(@NotNull Function<Player, ItemStack> provider);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create menu builder.
|
||||||
|
*
|
||||||
|
* @param rows The amount of rows.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
MenuBuilder createMenuBuilder(int rows);
|
||||||
|
}
|
||||||
@@ -1,25 +1,21 @@
|
|||||||
package com.willfp.eco.core.gui.menu;
|
package com.willfp.eco.core.gui.menu;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.Eco;
|
||||||
import com.willfp.eco.core.gui.slot.Slot;
|
import com.willfp.eco.core.gui.slot.Slot;
|
||||||
import com.willfp.eco.internal.gui.EcoMenu;
|
|
||||||
import com.willfp.eco.internal.gui.FillerSlot;
|
|
||||||
import com.willfp.eco.util.ListUtils;
|
|
||||||
import com.willfp.eco.util.StringUtils;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.InventoryCloseEvent;
|
|
||||||
import org.bukkit.inventory.Inventory;
|
import org.bukkit.inventory.Inventory;
|
||||||
import org.bukkit.inventory.ItemStack;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.List;
|
/**
|
||||||
import java.util.function.Consumer;
|
* GUI version of {@link Inventory}.
|
||||||
|
* <p>
|
||||||
|
* A menu contains slots and is 1-indexed. (Top row has index 1, bottom row has index 6).
|
||||||
|
*/
|
||||||
public interface Menu {
|
public interface Menu {
|
||||||
/**
|
/**
|
||||||
* Get the amount of rows.
|
* Get the amount of rows.
|
||||||
*
|
*
|
||||||
* @return
|
* @return The amount of rows.
|
||||||
*/
|
*/
|
||||||
int getRows();
|
int getRows();
|
||||||
|
|
||||||
@@ -54,93 +50,7 @@ public interface Menu {
|
|||||||
* @param rows The rows.
|
* @param rows The rows.
|
||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
static Builder builder(final int rows) {
|
static MenuBuilder builder(final int rows) {
|
||||||
return new Builder(rows);
|
return Eco.getHandler().getGUIFactory().createMenuBuilder(rows);
|
||||||
}
|
|
||||||
|
|
||||||
class Builder {
|
|
||||||
/**
|
|
||||||
* The amount of rows.
|
|
||||||
*/
|
|
||||||
private final int rows;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The title.
|
|
||||||
*/
|
|
||||||
private String title = "Menu";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The mask slots.
|
|
||||||
*/
|
|
||||||
private List<List<Slot>> maskSlots;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The slots.
|
|
||||||
*/
|
|
||||||
private final List<List<Slot>> slots;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The close event handler.
|
|
||||||
*/
|
|
||||||
private Consumer<InventoryCloseEvent> onClose = (event) -> {
|
|
||||||
};
|
|
||||||
|
|
||||||
Builder(final int rows) {
|
|
||||||
this.rows = rows;
|
|
||||||
this.slots = ListUtils.create2DList(rows, 9);
|
|
||||||
this.maskSlots = ListUtils.create2DList(rows, 9);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setTitle(@NotNull final String title) {
|
|
||||||
this.title = StringUtils.translate(title);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setSlot(final int row,
|
|
||||||
final int column,
|
|
||||||
@NotNull final Slot slot) {
|
|
||||||
if (row < 1 || row > this.rows) {
|
|
||||||
throw new IllegalArgumentException("Invalid row number!");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (column < 1 || column > 9) {
|
|
||||||
throw new IllegalArgumentException("Invalid column number!");
|
|
||||||
}
|
|
||||||
|
|
||||||
slots.get(row - 1).set(column - 1, slot);
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder setMask(@NotNull final FillerMask mask) {
|
|
||||||
this.maskSlots = mask.getMask();
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onClose(@NotNull final Consumer<InventoryCloseEvent> action) {
|
|
||||||
this.onClose = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Menu build() {
|
|
||||||
List<List<Slot>> finalSlots = maskSlots;
|
|
||||||
for (int i = 0; i < slots.size(); i++) {
|
|
||||||
for (int j = 0; j < slots.get(i).size(); j++) {
|
|
||||||
Slot slot = slots.get(i).get(j);
|
|
||||||
if (slot != null) {
|
|
||||||
finalSlots.get(i).set(j, slot);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (List<Slot> finalSlot : finalSlots) {
|
|
||||||
for (int j = 0; j < finalSlot.size(); j++) {
|
|
||||||
if (finalSlot.get(j) == null) {
|
|
||||||
finalSlot.set(j, new FillerSlot(new ItemStack(Material.AIR)));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new EcoMenu(rows, finalSlots, title, onClose);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package com.willfp.eco.core.gui.menu;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.gui.slot.FillerMask;
|
||||||
|
import com.willfp.eco.core.gui.slot.Slot;
|
||||||
|
import org.bukkit.event.inventory.InventoryCloseEvent;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Consumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder to create menus.
|
||||||
|
*/
|
||||||
|
public interface MenuBuilder {
|
||||||
|
/**
|
||||||
|
* Set the menu title.
|
||||||
|
*
|
||||||
|
* @param title The title.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
MenuBuilder setTitle(@NotNull String title);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set a slot.
|
||||||
|
*
|
||||||
|
* @param row The row.
|
||||||
|
* @param column The column.
|
||||||
|
* @param slot The slot.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
MenuBuilder setSlot(int row,
|
||||||
|
int column,
|
||||||
|
@NotNull Slot slot);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the menu mask.
|
||||||
|
*
|
||||||
|
* @param mask The mask.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
MenuBuilder setMask(@NotNull FillerMask mask);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the menu close handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
MenuBuilder onClose(@NotNull Consumer<InventoryCloseEvent> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the menu.
|
||||||
|
*
|
||||||
|
* @return The menu.
|
||||||
|
*/
|
||||||
|
Menu build();
|
||||||
|
}
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
package com.willfp.eco.core.gui.menu;
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
import com.willfp.eco.core.gui.slot.Slot;
|
|
||||||
import com.willfp.eco.core.items.builder.ItemStackBuilder;
|
import com.willfp.eco.core.items.builder.ItemStackBuilder;
|
||||||
import com.willfp.eco.internal.gui.FillerSlot;
|
|
||||||
import com.willfp.eco.util.ListUtils;
|
import com.willfp.eco.util.ListUtils;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
@@ -11,6 +9,21 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Mask of filler slots.
|
||||||
|
* <p>
|
||||||
|
* A pattern consists of 1s and 0s, where a 1 is a filler slot,
|
||||||
|
* and a 0 isn't.
|
||||||
|
* <p>
|
||||||
|
* For example, creating a filler mask for a single-chest sized menu would look like this:
|
||||||
|
* <p>
|
||||||
|
* new FillerMask(
|
||||||
|
* material,
|
||||||
|
* "11111111"
|
||||||
|
* "10000001"
|
||||||
|
* "11111111"
|
||||||
|
* );
|
||||||
|
*/
|
||||||
public class FillerMask {
|
public class FillerMask {
|
||||||
/**
|
/**
|
||||||
* Mask.
|
* Mask.
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
|
import lombok.Getter;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
import org.bukkit.inventory.ItemStack;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A filler slot is a slot that does nothing when clicked.
|
||||||
|
* <p>
|
||||||
|
* Useful for backgrounds.
|
||||||
|
*/
|
||||||
|
public class FillerSlot implements Slot {
|
||||||
|
/**
|
||||||
|
* The ItemStack.
|
||||||
|
*/
|
||||||
|
@Getter
|
||||||
|
private final ItemStack itemStack;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create new filler slot.
|
||||||
|
*
|
||||||
|
* @param itemStack The ItemStack.
|
||||||
|
*/
|
||||||
|
public FillerSlot(@NotNull final ItemStack itemStack) {
|
||||||
|
this.itemStack = itemStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ItemStack getItemStack(@NotNull final Player player) {
|
||||||
|
return itemStack;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,14 +1,15 @@
|
|||||||
package com.willfp.eco.core.gui.slot;
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
import com.willfp.eco.internal.gui.EcoSlot;
|
import com.willfp.eco.core.Eco;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.inventory.InventoryClickEvent;
|
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.function.BiConsumer;
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A slot is an item in a GUI that can handle clicks.
|
||||||
|
*/
|
||||||
public interface Slot {
|
public interface Slot {
|
||||||
/**
|
/**
|
||||||
* Get the ItemStack that would be shown to a player.
|
* Get the ItemStack that would be shown to a player.
|
||||||
@@ -24,8 +25,8 @@ public interface Slot {
|
|||||||
* @param itemStack The ItemStack.
|
* @param itemStack The ItemStack.
|
||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
static Builder builder(@NotNull final ItemStack itemStack) {
|
static SlotBuilder builder(@NotNull final ItemStack itemStack) {
|
||||||
return new Builder((player) -> itemStack);
|
return Eco.getHandler().getGUIFactory().createSlotBuilder(player -> itemStack);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -34,72 +35,7 @@ public interface Slot {
|
|||||||
* @param provider The provider.
|
* @param provider The provider.
|
||||||
* @return The builder.
|
* @return The builder.
|
||||||
*/
|
*/
|
||||||
static Builder builder(@NotNull final Function<Player, ItemStack> provider) {
|
static SlotBuilder builder(@NotNull final Function<Player, ItemStack> provider) {
|
||||||
return new Builder(provider);
|
return Eco.getHandler().getGUIFactory().createSlotBuilder(provider);
|
||||||
}
|
|
||||||
|
|
||||||
class Builder {
|
|
||||||
/**
|
|
||||||
* Provider.
|
|
||||||
*/
|
|
||||||
private final Function<Player, ItemStack> provider;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Left click handler.
|
|
||||||
*/
|
|
||||||
private BiConsumer<InventoryClickEvent, Slot> onLeftClick = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Right click handler.
|
|
||||||
*/
|
|
||||||
private BiConsumer<InventoryClickEvent, Slot> onRightClick = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shift-Left-Click handler.
|
|
||||||
*/
|
|
||||||
private BiConsumer<InventoryClickEvent, Slot> onShiftLeftClick = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Shift-Right-Click handler.
|
|
||||||
*/
|
|
||||||
private BiConsumer<InventoryClickEvent, Slot> onShiftRightClick = null;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Middle click handler.
|
|
||||||
*/
|
|
||||||
private BiConsumer<InventoryClickEvent, Slot> onMiddleClick = null;
|
|
||||||
|
|
||||||
Builder(@NotNull final Function<Player, ItemStack> provider) {
|
|
||||||
this.provider = provider;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onLeftClick(@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
|
||||||
this.onLeftClick = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onRightClick(@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
|
||||||
this.onRightClick = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onShiftLeftClick(@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
|
||||||
this.onShiftLeftClick = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onShiftRightClick(@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
|
||||||
this.onShiftRightClick = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Builder onMiddleClick(@NotNull final BiConsumer<InventoryClickEvent, Slot> action) {
|
|
||||||
this.onMiddleClick = action;
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Slot build() {
|
|
||||||
return new EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,58 @@
|
|||||||
|
package com.willfp.eco.core.gui.slot;
|
||||||
|
|
||||||
|
import org.bukkit.event.inventory.InventoryClickEvent;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.BiConsumer;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder to create slots.
|
||||||
|
*/
|
||||||
|
public interface SlotBuilder {
|
||||||
|
/**
|
||||||
|
* Set click handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder onLeftClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set click handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder onRightClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set click handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder onShiftLeftClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set click handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder onShiftRightClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set click handler.
|
||||||
|
*
|
||||||
|
* @param action The handler.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
SlotBuilder onMiddleClick(@NotNull BiConsumer<InventoryClickEvent, Slot> action);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Build the slot.
|
||||||
|
*
|
||||||
|
* @return The slot.
|
||||||
|
*/
|
||||||
|
Slot build();
|
||||||
|
}
|
||||||
@@ -1,8 +1,12 @@
|
|||||||
package com.willfp.eco.core.integrations;
|
package com.willfp.eco.core.integrations;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract class for integrations.
|
||||||
|
*/
|
||||||
public interface Integration {
|
public interface Integration {
|
||||||
/**
|
/**
|
||||||
* Get the name of integration.
|
* Get the name of integration.
|
||||||
|
*
|
||||||
* @return The name.
|
* @return The name.
|
||||||
*/
|
*/
|
||||||
String getPluginName();
|
String getPluginName();
|
||||||
|
|||||||
@@ -3,6 +3,11 @@ package com.willfp.eco.core.integrations;
|
|||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An integration loader runs a runnable only if a specific plugin is present on the server.
|
||||||
|
* <p>
|
||||||
|
* Used by {@link com.willfp.eco.core.EcoPlugin} to load integrations.
|
||||||
|
*/
|
||||||
public class IntegrationLoader {
|
public class IntegrationLoader {
|
||||||
/**
|
/**
|
||||||
* The lambda to be ran if the plugin is present.
|
* The lambda to be ran if the plugin is present.
|
||||||
|
|||||||
@@ -9,6 +9,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle anticheat integrations.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class AnticheatManager {
|
public class AnticheatManager {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ import com.willfp.eco.core.integrations.Integration;
|
|||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for anticheat integrations.
|
||||||
|
*/
|
||||||
public interface AnticheatWrapper extends Integration {
|
public interface AnticheatWrapper extends Integration {
|
||||||
/**
|
/**
|
||||||
* Exempt a player from checks.
|
* Exempt a player from checks.
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle antigrief integrations.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class AntigriefManager {
|
public class AntigriefManager {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -6,6 +6,9 @@ import org.bukkit.block.Block;
|
|||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for antigrief integrations.
|
||||||
|
*/
|
||||||
public interface AntigriefWrapper extends Integration {
|
public interface AntigriefWrapper extends Integration {
|
||||||
/**
|
/**
|
||||||
* Can player break block.
|
* Can player break block.
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package com.willfp.eco.core.integrations.customitems;
|
||||||
|
|
||||||
|
import lombok.experimental.UtilityClass;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle custom item integrations.
|
||||||
|
*/
|
||||||
|
@UtilityClass
|
||||||
|
public class CustomItemsManager {
|
||||||
|
/**
|
||||||
|
* A set of all registered integrations.
|
||||||
|
*/
|
||||||
|
private final Set<CustomItemsWrapper> registered = new HashSet<>();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a new integration.
|
||||||
|
*
|
||||||
|
* @param integration The integration to register.
|
||||||
|
*/
|
||||||
|
public void register(@NotNull final CustomItemsWrapper integration) {
|
||||||
|
registered.add(integration);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register all the custom items for a specific plugin into eco.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.items.Items
|
||||||
|
*/
|
||||||
|
public void registerAllItems() {
|
||||||
|
for (CustomItemsWrapper customItemsWrapper : registered) {
|
||||||
|
customItemsWrapper.registerAllItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
package com.willfp.eco.core.integrations.customitems;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for custom item integrations.
|
||||||
|
*/
|
||||||
|
public interface CustomItemsWrapper {
|
||||||
|
/**
|
||||||
|
* Register all the custom items for a specific plugin into eco.
|
||||||
|
*
|
||||||
|
* @see com.willfp.eco.core.items.Items
|
||||||
|
*/
|
||||||
|
void registerAllItems();
|
||||||
|
}
|
||||||
@@ -8,6 +8,9 @@ import org.jetbrains.annotations.NotNull;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle mcmmo integrations.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class McmmoManager {
|
public class McmmoManager {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -4,6 +4,9 @@ import org.bukkit.block.Block;
|
|||||||
import org.bukkit.event.Event;
|
import org.bukkit.event.Event;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for mcmmo integrations.
|
||||||
|
*/
|
||||||
public interface McmmoWrapper {
|
public interface McmmoWrapper {
|
||||||
/**
|
/**
|
||||||
* Get bonus drop count of block.
|
* Get bonus drop count of block.
|
||||||
|
|||||||
@@ -8,6 +8,11 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A {@link PlaceholderEntry} is a placeholder in and of itself.
|
||||||
|
* <p>
|
||||||
|
* It should be fairly straightforward.
|
||||||
|
*/
|
||||||
public class PlaceholderEntry {
|
public class PlaceholderEntry {
|
||||||
/**
|
/**
|
||||||
* The name of the placeholder, used in lookups.
|
* The name of the placeholder, used in lookups.
|
||||||
|
|||||||
@@ -5,6 +5,9 @@ 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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for placeholder integrations.
|
||||||
|
*/
|
||||||
public interface PlaceholderIntegration extends Integration {
|
public interface PlaceholderIntegration extends Integration {
|
||||||
/**
|
/**
|
||||||
* Register the integration with the specified plugin.
|
* Register the integration with the specified plugin.
|
||||||
|
|||||||
@@ -10,6 +10,9 @@ import java.util.Optional;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to handle placeholder integrations.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class PlaceholderManager {
|
public class PlaceholderManager {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -8,6 +8,15 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A custom item has 3 components:
|
||||||
|
*
|
||||||
|
* <ul>
|
||||||
|
* <li>The key to identify it</li>
|
||||||
|
* <li>The test to check if any item is this custom item</li>
|
||||||
|
* <li>The actual custom item {@link ItemStack}</li>
|
||||||
|
* </ul>
|
||||||
|
*/
|
||||||
public class CustomItem implements TestableItem {
|
public class CustomItem implements TestableItem {
|
||||||
/**
|
/**
|
||||||
* The key.
|
* The key.
|
||||||
|
|||||||
@@ -3,6 +3,7 @@ package com.willfp.eco.core.items;
|
|||||||
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
|
||||||
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
import com.willfp.eco.core.recipe.parts.MaterialTestableItem;
|
||||||
import com.willfp.eco.core.recipe.parts.TestableStack;
|
import com.willfp.eco.core.recipe.parts.TestableStack;
|
||||||
|
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.NamespacedKey;
|
import org.bukkit.NamespacedKey;
|
||||||
@@ -10,10 +11,14 @@ import org.bukkit.inventory.ItemStack;
|
|||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to manage all custom and vanilla items.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
@SuppressWarnings("deprecation")
|
|
||||||
public final class Items {
|
public final class Items {
|
||||||
/**
|
/**
|
||||||
* All recipe parts.
|
* All recipe parts.
|
||||||
@@ -51,7 +56,7 @@ public final class Items {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (split.length == 2) {
|
if (split.length == 2) {
|
||||||
CustomItem part = REGISTRY.get(new NamespacedKey(split[0], split[1]));
|
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
|
||||||
|
|
||||||
if (part == null) {
|
if (part == null) {
|
||||||
Material material = Material.getMaterial(split[0].toUpperCase());
|
Material material = Material.getMaterial(split[0].toUpperCase());
|
||||||
@@ -65,7 +70,7 @@ public final class Items {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (split.length == 3) {
|
if (split.length == 3) {
|
||||||
CustomItem part = REGISTRY.get(new NamespacedKey(split[0], split[1]));
|
CustomItem part = REGISTRY.get(NamespacedKeyUtils.create(split[0], split[1]));
|
||||||
return part == null ? new EmptyTestableItem() : new TestableStack(part, Integer.parseInt(split[2]));
|
return part == null ? new EmptyTestableItem() : new TestableStack(part, Integer.parseInt(split[2]));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -86,4 +91,13 @@ public final class Items {
|
|||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all registered custom items.
|
||||||
|
*
|
||||||
|
* @return A set of all items.
|
||||||
|
*/
|
||||||
|
public Set<CustomItem> getCustomItems() {
|
||||||
|
return new HashSet<>(REGISTRY.values());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ package com.willfp.eco.core.items;
|
|||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An item with a test to see if any item is that item.
|
||||||
|
*/
|
||||||
public interface TestableItem {
|
public interface TestableItem {
|
||||||
/**
|
/**
|
||||||
* If an ItemStack matches the recipe part.
|
* If an ItemStack matches the recipe part.
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package com.willfp.eco.internal.items;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
import com.willfp.eco.core.items.builder.ItemBuilder;
|
|
||||||
import com.willfp.eco.util.StringUtils;
|
import com.willfp.eco.util.StringUtils;
|
||||||
import lombok.AccessLevel;
|
import lombok.AccessLevel;
|
||||||
import lombok.Getter;
|
import lombok.Getter;
|
||||||
@@ -19,6 +18,12 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Abstract item builder class to build items.
|
||||||
|
*
|
||||||
|
* @param <T> The meta type.
|
||||||
|
* @param <U> Itself.
|
||||||
|
*/
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends AbstractItemStackBuilder<T, U>> implements ItemBuilder {
|
public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends AbstractItemStackBuilder<T, U>> implements ItemBuilder {
|
||||||
/**
|
/**
|
||||||
@@ -80,7 +85,7 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public U setDisplayName(@NotNull final String name) {
|
public U setDisplayName(@NotNull final String name) {
|
||||||
meta.setDisplayName(StringUtils.translate(name));
|
meta.setDisplayName(StringUtils.format(name));
|
||||||
return (U) this;
|
return (U) this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -95,7 +100,7 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
|||||||
public U addLoreLine(@NotNull final String line) {
|
public U addLoreLine(@NotNull final String line) {
|
||||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||||
assert lore != null;
|
assert lore != null;
|
||||||
lore.add(StringUtils.translate(line));
|
lore.add(StringUtils.format(line));
|
||||||
meta.setLore(lore);
|
meta.setLore(lore);
|
||||||
|
|
||||||
return (U) this;
|
return (U) this;
|
||||||
@@ -113,7 +118,7 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
|
|||||||
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
List<String> lore = meta.hasLore() ? meta.getLore() : new ArrayList<>();
|
||||||
assert lore != null;
|
assert lore != null;
|
||||||
for (String line : lines) {
|
for (String line : lines) {
|
||||||
lore.add(StringUtils.translate(line));
|
lore.add(StringUtils.format(line));
|
||||||
}
|
}
|
||||||
meta.setLore(lore);
|
meta.setLore(lore);
|
||||||
|
|
||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
import com.willfp.eco.internal.items.AbstractItemStackBuilder;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.enchantments.Enchantment;
|
import org.bukkit.enchantments.Enchantment;
|
||||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class to build enchanted books.
|
||||||
|
*/
|
||||||
public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentStorageMeta, EnchantedBookBuilder> {
|
public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentStorageMeta, EnchantedBookBuilder> {
|
||||||
/**
|
/**
|
||||||
* Create a new EnchantedBookBuilder.
|
* Create a new EnchantedBookBuilder.
|
||||||
@@ -26,4 +30,16 @@ public class EnchantedBookBuilder extends AbstractItemStackBuilder<EnchantmentSt
|
|||||||
this.getMeta().addStoredEnchant(enchantment, level, true);
|
this.getMeta().addStoredEnchant(enchantment, level, true);
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an enchantment to the item.
|
||||||
|
*
|
||||||
|
* @param enchantment The enchantment.
|
||||||
|
* @param level The level.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
public EnchantedBookBuilder addStoredEnchantment(@NotNull final Supplier<Enchantment> enchantment,
|
||||||
|
final Supplier<Integer> level) {
|
||||||
|
return this.addStoredEnchantment(enchantment.get(), level.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.function.Supplier;
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Interface for all item builders.
|
||||||
|
*/
|
||||||
public interface ItemBuilder {
|
public interface ItemBuilder {
|
||||||
/**
|
/**
|
||||||
* Set the ItemStack amount.
|
* Set the ItemStack amount.
|
||||||
|
|||||||
@@ -1,11 +1,13 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
import com.willfp.eco.internal.items.AbstractItemStackBuilder;
|
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.ItemMeta;
|
import org.bukkit.inventory.meta.ItemMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder for any item stack.
|
||||||
|
*/
|
||||||
public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemStackBuilder> {
|
public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemStackBuilder> {
|
||||||
/**
|
/**
|
||||||
* Create a new ItemStackBuilder.
|
* Create a new ItemStackBuilder.
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
import com.willfp.eco.internal.items.AbstractItemStackBuilder;
|
|
||||||
import org.bukkit.Color;
|
import org.bukkit.Color;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.ItemStack;
|
import org.bukkit.inventory.ItemStack;
|
||||||
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
import org.bukkit.inventory.meta.LeatherArmorMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder for leather armor.
|
||||||
|
*/
|
||||||
public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMeta, LeatherArmorBuilder> {
|
public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMeta, LeatherArmorBuilder> {
|
||||||
/**
|
/**
|
||||||
* Create a new ItemStackBuilder.
|
* Create a new ItemStackBuilder.
|
||||||
@@ -38,4 +42,14 @@ public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMe
|
|||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set leather color.
|
||||||
|
*
|
||||||
|
* @param color The color.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
public LeatherArmorBuilder setColor(@NotNull final Supplier<java.awt.Color> color) {
|
||||||
|
return this.setColor(color.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
package com.willfp.eco.core.items.builder;
|
package com.willfp.eco.core.items.builder;
|
||||||
|
|
||||||
import com.willfp.eco.internal.items.AbstractItemStackBuilder;
|
|
||||||
import com.willfp.eco.util.SkullUtils;
|
import com.willfp.eco.util.SkullUtils;
|
||||||
import org.bukkit.Material;
|
import org.bukkit.Material;
|
||||||
import org.bukkit.inventory.meta.SkullMeta;
|
import org.bukkit.inventory.meta.SkullMeta;
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
import java.util.function.Supplier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Builder for player heads.
|
||||||
|
*/
|
||||||
public class SkullBuilder extends AbstractItemStackBuilder<SkullMeta, SkullBuilder> {
|
public class SkullBuilder extends AbstractItemStackBuilder<SkullMeta, SkullBuilder> {
|
||||||
/**
|
/**
|
||||||
* Create a new EnchantedBookBuilder.
|
* Create a new EnchantedBookBuilder.
|
||||||
@@ -25,4 +29,14 @@ public class SkullBuilder extends AbstractItemStackBuilder<SkullMeta, SkullBuild
|
|||||||
|
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set skull texture.
|
||||||
|
*
|
||||||
|
* @param texture The texture.
|
||||||
|
* @return The builder.
|
||||||
|
*/
|
||||||
|
public SkullBuilder setSkullTexture(@NotNull final Supplier<String> texture) {
|
||||||
|
return this.setSkullTexture(texture.get());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,14 @@
|
|||||||
package com.willfp.eco.core.proxy;
|
package com.willfp.eco.core.proxy;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* All proxies must implement this interface.
|
||||||
|
* <p>
|
||||||
|
* A proxy is an NMS implementation of a proxy interface.
|
||||||
|
* <p>
|
||||||
|
* This allows for cross-version support.
|
||||||
|
* <p>
|
||||||
|
* See the core-spigot and core-nms modules of eco to see an example.
|
||||||
|
*/
|
||||||
public interface AbstractProxy {
|
public interface AbstractProxy {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
18
eco-api/src/main/java/com/willfp/eco/core/proxy/Cleaner.java
Normal file
18
eco-api/src/main/java/com/willfp/eco/core/proxy/Cleaner.java
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
package com.willfp.eco.core.proxy;
|
||||||
|
|
||||||
|
import com.willfp.eco.core.EcoPlugin;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A cleaner is an internal component to fix classloader errors.
|
||||||
|
* <p>
|
||||||
|
* Important to allow for PlugMan/ServerUtils support.
|
||||||
|
*/
|
||||||
|
public interface Cleaner {
|
||||||
|
/**
|
||||||
|
* Clean up classes left over from plugin.
|
||||||
|
*
|
||||||
|
* @param plugin The plugin.
|
||||||
|
*/
|
||||||
|
void clean(@NotNull EcoPlugin plugin);
|
||||||
|
}
|
||||||
@@ -3,6 +3,9 @@ package com.willfp.eco.core.proxy;
|
|||||||
import lombok.experimental.UtilityClass;
|
import lombok.experimental.UtilityClass;
|
||||||
import org.bukkit.Bukkit;
|
import org.bukkit.Bukkit;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Proxy / NMS constants.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
public class ProxyConstants {
|
public class ProxyConstants {
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.willfp.eco.core.proxy;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Factory to make proxies.
|
||||||
|
*/
|
||||||
|
public interface ProxyFactory {
|
||||||
|
/**
|
||||||
|
* Get the proxy implementation.
|
||||||
|
*
|
||||||
|
* @param proxyClass The proxy class.
|
||||||
|
* @param <T> The proxy class.
|
||||||
|
* @return The proxy implementation.
|
||||||
|
*/
|
||||||
|
<T extends AbstractProxy> @NotNull T getProxy(@NotNull Class<T> proxyClass);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package com.willfp.eco.core.proxy.exceptions;
|
||||||
|
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generic error with proxy loading.
|
||||||
|
*/
|
||||||
|
public class ProxyError extends RuntimeException {
|
||||||
|
/**
|
||||||
|
* Thrown if there is an error getting a proxy.
|
||||||
|
*
|
||||||
|
* @param message The message to send.
|
||||||
|
*/
|
||||||
|
public ProxyError(@NotNull final String message) {
|
||||||
|
super(message);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
package com.willfp.eco.core.proxy;
|
package com.willfp.eco.core.proxy.exceptions;
|
||||||
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
|
||||||
public class UnsupportedVersionException extends RuntimeException {
|
/**
|
||||||
|
* Error if the server is running an unsupported version.
|
||||||
|
*/
|
||||||
|
public class UnsupportedVersionException extends ProxyError {
|
||||||
/**
|
/**
|
||||||
* Thrown if the server is running an unsupported NMS version.
|
* Thrown if the server is running an unsupported NMS version.
|
||||||
*
|
*
|
||||||
@@ -14,6 +14,9 @@ import org.jetbrains.annotations.Nullable;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Utility class to manage and register crafting recipes.
|
||||||
|
*/
|
||||||
@UtilityClass
|
@UtilityClass
|
||||||
@SuppressWarnings("deprecation")
|
@SuppressWarnings("deprecation")
|
||||||
public class Recipes {
|
public class Recipes {
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user