Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f003ed06a8 | ||
|
|
f864953da2 | ||
|
|
6ef31444ac | ||
|
|
99258116de | ||
|
|
a59c68102e | ||
|
|
2482525fe2 | ||
|
|
acb326c0c8 | ||
|
|
11d947e24b | ||
|
|
3cced3012c | ||
|
|
520523e903 | ||
|
|
ee36cc74f8 | ||
|
|
55344e0550 | ||
|
|
75f6f05c7d | ||
|
|
17fa519501 | ||
|
|
1a72cf3ca9 | ||
|
|
d11f355c44 | ||
|
|
1852ff86ec | ||
|
|
ffe9219f45 | ||
|
|
f67a5d3b3d | ||
|
|
bbd541abe0 | ||
|
|
3de8d0fed9 | ||
|
|
df4abe39eb | ||
|
|
f5e289966f | ||
|
|
bcfa4bd82e | ||
|
|
229c9e58c3 | ||
|
|
4f30a6e04e | ||
|
|
9ea45ee0d0 | ||
|
|
192316214d | ||
|
|
feb8898a87 | ||
|
|
1e64815e47 | ||
|
|
dc10648c25 | ||
|
|
70131a6cae | ||
|
|
6d23cc7141 | ||
|
|
473202527a | ||
|
|
bc24aaeb3c | ||
|
|
52072bd935 | ||
|
|
ad47b7898e | ||
|
|
19d6533db6 | ||
|
|
3a37d40271 | ||
|
|
cb3ccbb39a | ||
|
|
5c3bb678b3 | ||
|
|
4f4ee82e6b | ||
|
|
32d88f55f8 | ||
|
|
bc8d615079 | ||
|
|
55b7c3c16f | ||
|
|
9535986f59 | ||
|
|
fb17fc1383 | ||
|
|
4221368388 | ||
|
|
d4432d0cb8 | ||
|
|
f9093c2ed6 | ||
|
|
15f4d5c098 | ||
|
|
dc47bc7995 | ||
|
|
29ce0deb1b | ||
|
|
fd78402bf5 | ||
|
|
5f65e3f520 | ||
|
|
ceaf4d34a5 | ||
|
|
2d2e5f8150 | ||
|
|
323a4aefef | ||
|
|
af486580c1 | ||
|
|
7955a94f14 | ||
|
|
c99a1bd50a | ||
|
|
93364247de | ||
|
|
49612eddcb | ||
|
|
834c29f843 | ||
|
|
a806ac039d | ||
|
|
0ca2651af0 | ||
|
|
6157fdcfa1 | ||
|
|
36cfcd24c2 | ||
|
|
d4558db40c | ||
|
|
3f8448fee1 | ||
|
|
8b6e15457c | ||
|
|
b99e822db3 | ||
|
|
02f8d33a81 | ||
|
|
76042bea68 | ||
|
|
51ad09c536 | ||
|
|
264c591020 | ||
|
|
6bd3ca0f5c | ||
|
|
98df14a23a | ||
|
|
ccb6e38064 | ||
|
|
50f1ba6a19 | ||
|
|
501e7b05a6 | ||
|
|
ebf8abf764 | ||
|
|
aff8fa8e88 | ||
|
|
1accad88fe | ||
|
|
a3a5e4df38 | ||
|
|
6e8dc1d729 | ||
|
|
a8556008f9 | ||
|
|
ab18a8bd29 | ||
|
|
a053f512f8 | ||
|
|
add5390787 | ||
|
|
49687f9a91 | ||
|
|
5480c70f8c | ||
|
|
ef922f6d3f | ||
|
|
026bc55ffb | ||
|
|
270fdbb18c | ||
|
|
fbf5967d17 | ||
|
|
4102be1201 | ||
|
|
f6bdb9cc65 | ||
|
|
c8282d1acf | ||
|
|
b056b537ef | ||
|
|
f69b458731 |
15
.github/workflows/checkstyle.yml
vendored
15
.github/workflows/checkstyle.yml
vendored
@@ -1,15 +0,0 @@
|
||||
name: Check PR Codestyle
|
||||
on: [ pull_request ]
|
||||
|
||||
jobs:
|
||||
checkstyle:
|
||||
name: Checkstyle
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: dbelyaev/action-checkstyle@v0.5.1
|
||||
with:
|
||||
github_token: ${{ secrets.github_token }}
|
||||
reporter: github-pr-review
|
||||
level: warning
|
||||
checkstyle_config: ../../config/checkstyle/checkstyle.xml
|
||||
2
.github/workflows/publish-release.yml
vendored
2
.github/workflows/publish-release.yml
vendored
@@ -28,6 +28,8 @@ jobs:
|
||||
- name: Publish artifact
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
MAVEN_USERNAME: ${{ secrets.MAVEN_USERNAME }}
|
||||
MAVEN_PASSWORD: ${{ secrets.MAVEN_PASSWORD }}
|
||||
|
||||
# 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.
|
||||
|
||||
20
README.md
20
README.md
@@ -31,6 +31,7 @@ eco comes packed with all the tools you need in your plugins:
|
||||
- Yaml/JSON/TOML config system
|
||||
- Persistent data storage API with Yaml/MySQL/MongoDB support
|
||||
- Packet item display system
|
||||
- Lightweight event loop based packet API
|
||||
- Entity AI API with near-1:1 NMS mappings
|
||||
- More events
|
||||
- Extension API, essentially plugins for plugins
|
||||
@@ -52,7 +53,6 @@ eco comes packed with all the tools you need in your plugins:
|
||||
- And much more
|
||||
|
||||
# For server owners
|
||||
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
|
||||
- Supports 1.17+
|
||||
|
||||
## Downloads
|
||||
@@ -63,7 +63,7 @@ eco comes packed with all the tools you need in your plugins:
|
||||
# For developers
|
||||
|
||||
## Javadoc
|
||||
The 6.49.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.49.0/javadoc/)
|
||||
The 6.53.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.53.0/javadoc/)
|
||||
|
||||
## Plugin Information
|
||||
|
||||
@@ -75,31 +75,31 @@ depend:
|
||||
- eco
|
||||
```
|
||||
|
||||
## Get from JitPack:
|
||||
## Dependency Information:
|
||||
|
||||
Gradle:
|
||||
|
||||
```groovy
|
||||
```kts
|
||||
repositories {
|
||||
maven { url 'https://jitpack.io' }
|
||||
maven("https://repo.auxilor.io/repository/maven-public/")
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
```groovy
|
||||
dependencies {
|
||||
compileOnly 'com.willfp:eco:Tag'
|
||||
compileOnly("com.willfp:eco:Tag")
|
||||
}
|
||||
```
|
||||
|
||||
Replace `Tag` with a release tag for eco, eg `6.49.0`.
|
||||
Replace `Tag` with a release tag for eco, eg `6.53.0`.
|
||||
|
||||
Maven:
|
||||
|
||||
```xml
|
||||
<repository>
|
||||
<id>jitpack.io</id>
|
||||
<url>https://jitpack.io</url>
|
||||
<id>auxilor</id>
|
||||
<url>https://repo.auxilor.io/repository/maven-public/</url>
|
||||
</repository>
|
||||
```
|
||||
|
||||
@@ -112,7 +112,7 @@ Maven:
|
||||
</dependency>
|
||||
```
|
||||
|
||||
Replace `Tag` with a release tag for eco, eg `6.49.0`.
|
||||
Replace `Tag` with a release tag for eco, eg `6.53.0`.
|
||||
|
||||
## Build locally:
|
||||
|
||||
|
||||
@@ -26,6 +26,7 @@ dependencies {
|
||||
implementation(project(path = ":eco-core:core-nms:v1_18_R2", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_19_R1", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_19_R2", configuration = "reobf"))
|
||||
implementation(project(path = ":eco-core:core-nms:v1_19_R3", configuration = "reobf"))
|
||||
}
|
||||
|
||||
allprojects {
|
||||
@@ -56,7 +57,7 @@ allprojects {
|
||||
maven("https://repo.extendedclip.com/content/repositories/placeholderapi/")
|
||||
|
||||
// ProtocolLib
|
||||
maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
||||
//maven("https://repo.dmulloy2.net/nexus/repository/public/")
|
||||
|
||||
// WorldGuard
|
||||
maven("https://maven.enginehub.org/repo/")
|
||||
@@ -79,6 +80,7 @@ allprojects {
|
||||
// LibsDisguises
|
||||
maven("https://repo.md-5.net/content/groups/public/")
|
||||
|
||||
// UltraEconomy
|
||||
maven("https://repo.techscode.com/repository/maven-releases/")
|
||||
}
|
||||
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
dependencies {
|
||||
// Adventure
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.1.0'
|
||||
|
||||
// Other
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.8'
|
||||
}
|
||||
|
||||
group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
build.dependsOn publishToMavenLocal
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
shadow(MavenPublication) {
|
||||
from components.java
|
||||
artifactId 'eco'
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name = "GitHubPackages"
|
||||
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
||||
credentials {
|
||||
username = System.getenv("GITHUB_ACTOR")
|
||||
password = System.getenv("GITHUB_TOKEN")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
55
eco-api/build.gradle.kts
Normal file
55
eco-api/build.gradle.kts
Normal file
@@ -0,0 +1,55 @@
|
||||
dependencies {
|
||||
// Adventure
|
||||
compileOnly("net.kyori:adventure-platform-bukkit:4.1.0")
|
||||
|
||||
// Other
|
||||
compileOnly("org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT")
|
||||
compileOnly("com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT")
|
||||
compileOnly("com.google.code.gson:gson:2.8.8")
|
||||
}
|
||||
|
||||
group = "com.willfp"
|
||||
version = rootProject.version
|
||||
|
||||
java {
|
||||
withJavadocJar()
|
||||
}
|
||||
|
||||
tasks {
|
||||
build {
|
||||
dependsOn(publishToMavenLocal)
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
publications {
|
||||
create<MavenPublication>("shadow") {
|
||||
from(components["java"])
|
||||
artifactId = "eco"
|
||||
}
|
||||
}
|
||||
|
||||
repositories {
|
||||
maven {
|
||||
name = "GitHubPackages"
|
||||
url = uri("https://maven.pkg.github.com/Auxilor/eco")
|
||||
credentials {
|
||||
username = System.getenv("GITHUB_ACTOR")
|
||||
password = System.getenv("GITHUB_TOKEN")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
publishing {
|
||||
repositories {
|
||||
maven {
|
||||
name = "Auxilor"
|
||||
url = uri("https://repo.auxilor.io/repository/maven-releases/")
|
||||
credentials {
|
||||
username = System.getenv("MAVEN_USERNAME")
|
||||
password = System.getenv("MAVEN_PASSWORD")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,27 +13,30 @@ import java.util.Collections;
|
||||
|
||||
/**
|
||||
* Wrapper class for ProtocolLib packets.
|
||||
*
|
||||
* @deprecated ProtocolLib is no longer used by eco. Use {@link com.willfp.eco.core.packet.PacketListener} instead.
|
||||
*/
|
||||
@Deprecated(since = "6.51.0")
|
||||
public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
/**
|
||||
* The packet type to listen for.
|
||||
* The handle type to listen for.
|
||||
*/
|
||||
private final PacketType type;
|
||||
|
||||
/**
|
||||
* Whether the packet adapter should be registered after the server has loaded.
|
||||
* Whether the handle adapter should be registered after the server has loaded.
|
||||
* <p>
|
||||
* Useful for monitor priority adapters that <b>must</b> be ran last.
|
||||
*/
|
||||
private final boolean postLoad;
|
||||
|
||||
/**
|
||||
* Create a new packet adapter for a specified plugin and type.
|
||||
* Create a new handle adapter for a specified plugin and type.
|
||||
*
|
||||
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
||||
* @param type The {@link PacketType} to listen for.
|
||||
* @param priority The priority at which the adapter should be ran on packet send/receive.
|
||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
||||
* @param priority The priority at which the adapter should be ran on handle send/receive.
|
||||
* @param postLoad If the handle adapter should be registered after the server has loaded.
|
||||
*/
|
||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final PacketType type,
|
||||
@@ -45,11 +48,11 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new packet adapter for a specified plugin and type.
|
||||
* Create a new handle adapter for a specified plugin and type.
|
||||
*
|
||||
* @param plugin The plugin that ProtocolLib should mark as the owner.
|
||||
* @param type The {@link PacketType} to listen for.
|
||||
* @param postLoad If the packet adapter should be registered after the server has loaded.
|
||||
* @param postLoad If the handle adapter should be registered after the server has loaded.
|
||||
*/
|
||||
protected AbstractPacketAdapter(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final PacketType type,
|
||||
@@ -58,9 +61,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* The code that should be executed once the packet has been received.
|
||||
* The code that should be executed once the handle has been received.
|
||||
*
|
||||
* @param packet The packet.
|
||||
* @param packet The handle.
|
||||
* @param player The player.
|
||||
* @param event The event.
|
||||
*/
|
||||
@@ -71,9 +74,9 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* THe code that should be executed once the packet has been sent.
|
||||
* THe code that should be executed once the handle has been sent.
|
||||
*
|
||||
* @param packet The packet.
|
||||
* @param packet The handle.
|
||||
* @param player The player.
|
||||
* @param event The event.
|
||||
*/
|
||||
@@ -84,7 +87,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Boilerplate to assert that the packet is of the specified type.
|
||||
* Boilerplate to assert that the handle is of the specified type.
|
||||
*
|
||||
* @param event The ProtocolLib event.
|
||||
*/
|
||||
@@ -102,7 +105,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Boilerplate to assert that the packet is of the specified type.
|
||||
* Boilerplate to assert that the handle is of the specified type.
|
||||
*
|
||||
* @param event The ProtocolLib event.
|
||||
*/
|
||||
@@ -125,7 +128,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the packet adapter with ProtocolLib.
|
||||
* Register the handle adapter with ProtocolLib.
|
||||
*/
|
||||
public final void register() {
|
||||
if (!ProtocolLibrary.getProtocolManager().getPacketListeners().contains(this)) {
|
||||
@@ -134,7 +137,7 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if the packet adapter should be loaded last.
|
||||
* Get if the handle adapter should be loaded last.
|
||||
*
|
||||
* @return If post load.
|
||||
*/
|
||||
|
||||
@@ -26,13 +26,13 @@ import com.willfp.eco.core.gui.slot.SlotBuilder;
|
||||
import com.willfp.eco.core.gui.slot.functional.SlotProvider;
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import com.willfp.eco.core.math.MathContext;
|
||||
import com.willfp.eco.core.packet.Packet;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.command.CommandMap;
|
||||
import org.bukkit.configuration.ConfigurationSection;
|
||||
import org.bukkit.entity.Entity;
|
||||
import org.bukkit.entity.Mob;
|
||||
@@ -547,19 +547,21 @@ public interface Eco {
|
||||
*/
|
||||
void syncCommands();
|
||||
|
||||
/**
|
||||
* Get the command map.
|
||||
*
|
||||
* @return The command map.
|
||||
*/
|
||||
@NotNull CommandMap getCommandMap();
|
||||
|
||||
/**
|
||||
* Unregister a command.
|
||||
*
|
||||
* @param command The command.
|
||||
*/
|
||||
void unregisterCommand(@NotNull final PluginCommand command);
|
||||
void unregisterCommand(@NotNull PluginCommandBase command);
|
||||
|
||||
/**
|
||||
* Send a packet.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param packet The packet.
|
||||
*/
|
||||
void sendPacket(@NotNull Player player,
|
||||
@NotNull Packet packet);
|
||||
|
||||
/**
|
||||
* Get the instance of eco; the bridge between the api frontend and the implementation backend.
|
||||
|
||||
@@ -13,7 +13,11 @@ 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.integrations.IntegrationLoader;
|
||||
import com.willfp.eco.core.map.ListMap;
|
||||
import com.willfp.eco.core.packet.PacketListener;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.registry.Registrable;
|
||||
import com.willfp.eco.core.registry.Registry;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import com.willfp.eco.core.web.UpdateChecker;
|
||||
import org.apache.commons.lang.Validate;
|
||||
@@ -34,6 +38,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.logging.Level;
|
||||
import java.util.logging.Logger;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -52,27 +57,12 @@ import java.util.stream.Collectors;
|
||||
* <b>IMPORTANT: When reloading a plugin, all runnables / tasks will
|
||||
* be cancelled.</b>
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
@SuppressWarnings({"unused", "DeprecatedIsStillUsed", "deprecation", "RedundantSuppression", "MismatchedQueryAndUpdateOfCollection"})
|
||||
public abstract class EcoPlugin extends JavaPlugin implements PluginLike, Registrable {
|
||||
/**
|
||||
* The polymart resource ID of the plugin.
|
||||
* The properties (eco.yml).
|
||||
*/
|
||||
private final int resourceId;
|
||||
|
||||
/**
|
||||
* The bStats resource ID of the plugin.
|
||||
*/
|
||||
private final int bStatsId;
|
||||
|
||||
/**
|
||||
* The package where proxy implementations are.
|
||||
*/
|
||||
private final String proxyPackage;
|
||||
|
||||
/**
|
||||
* The color of the plugin, used in messages.
|
||||
*/
|
||||
private final String color;
|
||||
private final PluginProps props;
|
||||
|
||||
/**
|
||||
* Loaded integrations.
|
||||
@@ -141,11 +131,6 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
*/
|
||||
private boolean outdated = false;
|
||||
|
||||
/**
|
||||
* If the plugin supports extensions.
|
||||
*/
|
||||
private final boolean supportingExtensions;
|
||||
|
||||
/**
|
||||
* The proxy factory.
|
||||
*/
|
||||
@@ -155,27 +140,27 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
/**
|
||||
* The tasks to run on enable.
|
||||
*/
|
||||
private final List<Runnable> onEnable = new ArrayList<>();
|
||||
private final ListMap<LifecyclePosition, Runnable> onEnable = new ListMap<>();
|
||||
|
||||
/**
|
||||
* The tasks to run on disable.
|
||||
*/
|
||||
private final List<Runnable> onDisable = new ArrayList<>();
|
||||
private final ListMap<LifecyclePosition, Runnable> onDisable = new ListMap<>();
|
||||
|
||||
/**
|
||||
* The tasks to run on reload.
|
||||
*/
|
||||
private final List<Runnable> onReload = new ArrayList<>();
|
||||
private final ListMap<LifecyclePosition, Runnable> onReload = new ListMap<>();
|
||||
|
||||
/**
|
||||
* The tasks to run on load.
|
||||
*/
|
||||
private final List<Runnable> onLoad = new ArrayList<>();
|
||||
private final ListMap<LifecyclePosition, Runnable> onLoad = new ListMap<>();
|
||||
|
||||
/**
|
||||
* The tasks to run after load.
|
||||
*/
|
||||
private final List<Runnable> afterLoad = new ArrayList<>();
|
||||
private final ListMap<LifecyclePosition, Runnable> afterLoad = new ListMap<>();
|
||||
|
||||
/**
|
||||
* Create a new plugin.
|
||||
@@ -192,7 +177,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* Create a new plugin without proxy support, polymart, or bStats.
|
||||
*
|
||||
* @param color The color.
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(@NotNull final String color) {
|
||||
this("", color);
|
||||
}
|
||||
@@ -203,7 +190,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
*
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(@NotNull final String proxyPackage,
|
||||
@NotNull final String color) {
|
||||
this(0, 0, proxyPackage, color);
|
||||
@@ -215,7 +204,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param resourceId The polymart 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)
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String color) {
|
||||
@@ -229,7 +220,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @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.
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String color,
|
||||
@@ -244,7 +237,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @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)
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
@@ -260,21 +255,15 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @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.
|
||||
* @deprecated Use eco.yml instead.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
protected EcoPlugin(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
@NotNull final String color,
|
||||
final boolean supportingExtensions) {
|
||||
this(
|
||||
PluginProps.createSimple(
|
||||
resourceId,
|
||||
bStatsId,
|
||||
proxyPackage,
|
||||
color,
|
||||
supportingExtensions
|
||||
)
|
||||
);
|
||||
this(PluginProps.createSimple(resourceId, bStatsId, proxyPackage, color, supportingExtensions));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -324,13 +313,9 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
PluginProps props = this.mutateProps(generatedProps);
|
||||
props.validate();
|
||||
|
||||
this.resourceId = props.getResourceId();
|
||||
this.bStatsId = props.getBStatsId();
|
||||
this.proxyPackage = props.getProxyPackage();
|
||||
this.color = props.getColor();
|
||||
this.supportingExtensions = props.isSupportingExtensions();
|
||||
this.props = props;
|
||||
|
||||
this.proxyFactory = this.proxyPackage.equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
||||
this.proxyFactory = this.props.getProxyPackage().equalsIgnoreCase("") ? null : Eco.get().createProxyFactory(this);
|
||||
this.logger = Eco.get().createLogger(this);
|
||||
|
||||
this.getLogger().info("Initializing " + this.getColor() + this.getName());
|
||||
@@ -400,10 +385,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
Eco.get().registerBStats(this);
|
||||
}
|
||||
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
||||
.map(Plugin::getName)
|
||||
.map(String::toLowerCase)
|
||||
.collect(Collectors.toSet());
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).map(String::toLowerCase).collect(Collectors.toSet());
|
||||
|
||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||
Eco.get().createPAPIIntegration(this);
|
||||
@@ -411,8 +393,13 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
|
||||
this.loadIntegrationLoaders().forEach(integrationLoader -> {
|
||||
if (enabledPlugins.contains(integrationLoader.getPluginName().toLowerCase())) {
|
||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||
integrationLoader.load();
|
||||
try {
|
||||
integrationLoader.load();
|
||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||
} catch (Exception e) {
|
||||
this.getLogger().warning("Failed to load integration for " + integrationLoader.getPluginName());
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -422,13 +409,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
|
||||
Prerequisite.update();
|
||||
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (!abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (!abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
this.loadListeners().forEach(listener -> this.getEventManager().registerListener(listener));
|
||||
this.loadPacketListeners().forEach(listener -> this.getEventManager().registerPacketListener(listener));
|
||||
|
||||
this.loadPluginCommands().forEach(PluginCommand::register);
|
||||
|
||||
@@ -445,8 +435,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
}
|
||||
}
|
||||
|
||||
this.handleEnable();
|
||||
this.onEnable.forEach(Runnable::run);
|
||||
this.handleLifecycle(this.onEnable, this::handleEnable);
|
||||
|
||||
this.getLogger().info("");
|
||||
}
|
||||
@@ -457,7 +446,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onEnable(@NotNull final Runnable task) {
|
||||
this.onEnable.add(task);
|
||||
this.onEnable(LifecyclePosition.END, task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run on enable.
|
||||
*
|
||||
* @param position The position to run the task.
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onEnable(@NotNull final LifecyclePosition position,
|
||||
@NotNull final Runnable task) {
|
||||
this.onEnable.append(position, task);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -470,8 +470,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.getEventManager().unregisterAllListeners();
|
||||
this.getScheduler().cancelAll();
|
||||
|
||||
this.handleDisable();
|
||||
this.onDisable.forEach(Runnable::run);
|
||||
this.handleLifecycle(this.onDisable, this::handleDisable);
|
||||
|
||||
if (this.isSupportingExtensions()) {
|
||||
this.getExtensionLoader().unloadExtensions();
|
||||
@@ -487,7 +486,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onDisable(@NotNull final Runnable task) {
|
||||
this.onDisable.add(task);
|
||||
this.onDisable(LifecyclePosition.END, task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run on disable.
|
||||
*
|
||||
* @param position The position to run the task.
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onDisable(@NotNull final LifecyclePosition position,
|
||||
@NotNull final Runnable task) {
|
||||
this.onDisable.append(position, task);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -497,8 +507,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public final void onLoad() {
|
||||
super.onLoad();
|
||||
|
||||
this.handleLoad();
|
||||
this.onLoad.forEach(Runnable::run);
|
||||
this.handleLifecycle(this.onLoad, this::handleLoad);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -507,7 +516,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onLoad(@NotNull final Runnable task) {
|
||||
this.onLoad.add(task);
|
||||
this.onLoad(LifecyclePosition.END, task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run on load.
|
||||
*
|
||||
* @param position The position to run the task.
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onLoad(@NotNull final LifecyclePosition position,
|
||||
@NotNull final Runnable task) {
|
||||
this.onLoad.append(position, task);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -520,11 +540,13 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
Display.registerDisplayModule(this.getDisplayModule());
|
||||
}
|
||||
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
if (Prerequisite.HAS_PROTOCOLLIB.isMet()) {
|
||||
this.loadPacketAdapters().forEach(abstractPacketAdapter -> {
|
||||
if (abstractPacketAdapter.isPostLoad()) {
|
||||
abstractPacketAdapter.register();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (!Prerequisite.HAS_PAPER.isMet()) {
|
||||
this.getLogger().severe("");
|
||||
@@ -539,8 +561,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.getLogger().severe("");
|
||||
}
|
||||
|
||||
this.handleAfterLoad();
|
||||
this.afterLoad.forEach(Runnable::run);
|
||||
this.handleLifecycle(this.afterLoad, this::handleAfterLoad);
|
||||
|
||||
this.reload();
|
||||
|
||||
@@ -548,7 +569,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
extension.handleAfterLoad();
|
||||
}
|
||||
|
||||
this.getLogger().info("Loaded " + this.color + this.getName());
|
||||
this.getLogger().info("Loaded " + this.props.getColor() + this.getName());
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -557,7 +578,18 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void afterLoad(@NotNull final Runnable task) {
|
||||
this.afterLoad.add(task);
|
||||
this.afterLoad(LifecyclePosition.END, task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run after load.
|
||||
*
|
||||
* @param position The position to run the task.
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void afterLoad(@NotNull final LifecyclePosition position,
|
||||
@NotNull final Runnable task) {
|
||||
this.afterLoad.append(position, task);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -570,8 +602,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
this.getConfigHandler().callUpdate();
|
||||
this.getConfigHandler().callUpdate(); // Call twice to fix issues
|
||||
|
||||
this.handleReload();
|
||||
this.onReload.forEach(Runnable::run);
|
||||
this.handleLifecycle(this.onReload, this::handleReload);
|
||||
|
||||
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
|
||||
extension.handleReload();
|
||||
@@ -579,12 +610,23 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run on enable.
|
||||
* Add new task to run on reload.
|
||||
*
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onReload(@NotNull final Runnable task) {
|
||||
this.onReload.add(task);
|
||||
this.onReload(LifecyclePosition.END, task);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add new task to run on reload.
|
||||
*
|
||||
* @param position The position to run the task.
|
||||
* @param task The task.
|
||||
*/
|
||||
public final void onReload(@NotNull final LifecyclePosition position,
|
||||
@NotNull final Runnable task) {
|
||||
this.onReload.append(position, task);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -600,6 +642,43 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
return System.currentTimeMillis() - startTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle lifecycle.
|
||||
*
|
||||
* @param tasks The tasks.
|
||||
* @param handler The handler.
|
||||
*/
|
||||
private void handleLifecycle(@NotNull final ListMap<LifecyclePosition, Runnable> tasks,
|
||||
@NotNull final Runnable handler) {
|
||||
for (Runnable task : tasks.get(LifecyclePosition.START)) {
|
||||
try {
|
||||
task.run();
|
||||
} catch (final Exception e) {
|
||||
this.getLogger().log(Level.SEVERE, "Error while running lifecycle task!");
|
||||
this.getLogger().log(Level.SEVERE, "The plugin may not function properly");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
try {
|
||||
handler.run();
|
||||
} catch (final Exception e) {
|
||||
this.getLogger().log(Level.SEVERE, "Error while running lifecycle task!");
|
||||
this.getLogger().log(Level.SEVERE, "The plugin may not function properly");
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
for (Runnable task : tasks.get(LifecyclePosition.END)) {
|
||||
try {
|
||||
task.run();
|
||||
} catch (final Exception e) {
|
||||
this.getLogger().log(Level.SEVERE, "Error while running lifecycle task!");
|
||||
this.getLogger().log(Level.SEVERE, "The plugin may not function properly");
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The plugin-specific code to be executed on enable.
|
||||
* <p>
|
||||
@@ -681,22 +760,35 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
}
|
||||
|
||||
/**
|
||||
* ProtocolLib packet adapters to be registered.
|
||||
* ProtocolLib handle adapters to be registered.
|
||||
* <p>
|
||||
* If the plugin does not require ProtocolLib this can be left empty.
|
||||
*
|
||||
* @return A list of packet adapters.
|
||||
* @return A list of handle adapters.
|
||||
* @deprecated Use {@link #loadPacketListeners()} instead.
|
||||
*/
|
||||
@Deprecated(since = "6.51.0")
|
||||
protected List<AbstractPacketAdapter> loadPacketAdapters() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Packet Listeners to be registered.
|
||||
*
|
||||
* @return A list of handle listeners.
|
||||
*/
|
||||
protected List<PacketListener> loadPacketListeners() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* All listeners to be registered.
|
||||
*
|
||||
* @return A list of all listeners.
|
||||
*/
|
||||
protected abstract List<Listener> loadListeners();
|
||||
protected List<Listener> loadListeners() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
/**
|
||||
* Useful for custom LangYml implementations.
|
||||
@@ -743,10 +835,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
*/
|
||||
@Nullable
|
||||
protected DisplayModule createDisplayModule() {
|
||||
Validate.isTrue(
|
||||
this.getDisplayModule() == null,
|
||||
"Display module exists!"
|
||||
);
|
||||
Validate.isTrue(this.getDisplayModule() == null, "Display module exists!");
|
||||
|
||||
return null;
|
||||
}
|
||||
@@ -845,6 +934,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @param pluginName The name.
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
public static EcoPlugin getPlugin(@NotNull final String pluginName) {
|
||||
return Eco.get().getPluginByName(pluginName);
|
||||
}
|
||||
@@ -854,17 +944,28 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
*
|
||||
* @return The set of names.
|
||||
*/
|
||||
@NotNull
|
||||
public static Set<String> getPluginNames() {
|
||||
return new HashSet<>(Eco.get().getLoadedPlugins());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin props. (eco.yml).
|
||||
*
|
||||
* @return The props.
|
||||
*/
|
||||
@NotNull
|
||||
public PluginProps getProps() {
|
||||
return this.props;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the polymart resource ID.
|
||||
*
|
||||
* @return The resource ID.
|
||||
*/
|
||||
public int getResourceId() {
|
||||
return this.resourceId;
|
||||
return this.getProps().getResourceId();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -873,7 +974,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The ID.
|
||||
*/
|
||||
public int getBStatsId() {
|
||||
return this.bStatsId;
|
||||
return this.getProps().getBStatsId();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -882,7 +983,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The package where proxies are contained.
|
||||
*/
|
||||
public String getProxyPackage() {
|
||||
return this.proxyPackage;
|
||||
return this.getProps().getProxyPackage();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -891,7 +992,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return The color.
|
||||
*/
|
||||
public String getColor() {
|
||||
return this.color;
|
||||
return this.getProps().getColor();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1009,7 +1110,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
* @return If extensions are supported.
|
||||
*/
|
||||
public boolean isSupportingExtensions() {
|
||||
return this.supportingExtensions;
|
||||
return this.getProps().isSupportingExtensions();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -1043,4 +1144,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
|
||||
public FixedMetadataValue createMetadataValue(@NotNull final Object value) {
|
||||
return this.getMetadataValueFactory().create(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
public final String getID() {
|
||||
return Registry.tryFitPattern(this.getName());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
/**
|
||||
* Marks a position in a lifecycle (e.g. enable, reload, etc).
|
||||
*/
|
||||
public enum LifecyclePosition {
|
||||
/**
|
||||
* Run at the start of the lifecycle.
|
||||
*/
|
||||
START,
|
||||
|
||||
/**
|
||||
* Run at the end of the lifecycle.
|
||||
*/
|
||||
END
|
||||
}
|
||||
@@ -1,44 +0,0 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Quick DI class to manage passing eco plugins.
|
||||
* <p>
|
||||
* Basically just a quick bit of laziness if you can't be bothered to add a private field
|
||||
* and a protected getter, don't use this in kotlin as you can just specify
|
||||
* {@code
|
||||
* private val plugin: EcoPlugin
|
||||
* }
|
||||
* in the constructor.
|
||||
*
|
||||
* @param <T> The eco plugin type.
|
||||
* @deprecated Leaky inheritance, shouldn't exist.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
public abstract class PluginDependent<T extends EcoPlugin> {
|
||||
/**
|
||||
* The {@link EcoPlugin} that is stored.
|
||||
*/
|
||||
@NotNull
|
||||
private final T plugin;
|
||||
|
||||
/**
|
||||
* Pass an {@link EcoPlugin} in order to interface with it.
|
||||
*
|
||||
* @param plugin The plugin to manage.
|
||||
*/
|
||||
protected PluginDependent(@NotNull final T plugin) {
|
||||
this.plugin = plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@NotNull
|
||||
protected T getPlugin() {
|
||||
return this.plugin;
|
||||
}
|
||||
}
|
||||
@@ -49,6 +49,16 @@ public final class PluginProps {
|
||||
@Nullable
|
||||
private Boolean supportingExtensions;
|
||||
|
||||
/**
|
||||
* The environment variables.
|
||||
*/
|
||||
private final Map<String, String> environment = new HashMap<>();
|
||||
|
||||
/**
|
||||
* If the plugin uses reflective reload (via {@link com.willfp.eco.core.config.updating.ConfigUpdater}).
|
||||
*/
|
||||
private boolean usesReflectiveReload = true;
|
||||
|
||||
/**
|
||||
* Create new blank props.
|
||||
*/
|
||||
@@ -153,6 +163,46 @@ public final class PluginProps {
|
||||
this.supportingExtensions = supportingExtensions;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get an environment variable.
|
||||
*
|
||||
* @param name The name.
|
||||
* @return The value of the variable.
|
||||
*/
|
||||
@Nullable
|
||||
public String getEnvironmentVariable(@NotNull final String name) {
|
||||
return environment.get(name);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set an environment variable.
|
||||
*
|
||||
* @param name The name.
|
||||
* @param value The value.
|
||||
*/
|
||||
public void setEnvironmentVariable(@NotNull final String name,
|
||||
@NotNull final String value) {
|
||||
environment.put(name, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the plugin uses reflective reload.
|
||||
*
|
||||
* @return If the plugin uses reflective reload.
|
||||
*/
|
||||
public boolean isUsingReflectiveReload() {
|
||||
return usesReflectiveReload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set if the plugin uses reflective reload.
|
||||
*
|
||||
* @param usesReflectiveReload If the plugin uses reflective reload.
|
||||
*/
|
||||
public void setUsesReflectiveReload(final boolean usesReflectiveReload) {
|
||||
this.usesReflectiveReload = usesReflectiveReload;
|
||||
}
|
||||
|
||||
/**
|
||||
* Ensure that all required props have been set.
|
||||
*/
|
||||
@@ -232,7 +282,9 @@ public final class PluginProps {
|
||||
* @param color The primary color of the plugin.
|
||||
* @param supportsExtensions If the plugin should attempt to look for extensions.
|
||||
* @return The props.
|
||||
* @deprecated Moving to force the usage of eco.yml.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0")
|
||||
static PluginProps createSimple(final int resourceId,
|
||||
final int bStatsId,
|
||||
@NotNull final String proxyPackage,
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
package com.willfp.eco.core;
|
||||
|
||||
import com.willfp.eco.core.integrations.economy.EconomyManager;
|
||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||
import com.willfp.eco.util.ClassUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -31,14 +30,19 @@ public class Prerequisite {
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to have vault installed.
|
||||
*
|
||||
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
|
||||
* Requires the server to be running an implementation of paper.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
public static final Prerequisite HAS_VAULT = new Prerequisite(
|
||||
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
|
||||
"Requires server to have vault"
|
||||
public static final Prerequisite HAS_PROTOCOLLIB = new Prerequisite(
|
||||
() -> ClassUtils.exists("com.comphenix.protocol.events.PacketAdapter"),
|
||||
"Requires server to have ProtocolLib"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.19.4.
|
||||
*/
|
||||
public static final Prerequisite HAS_1_19_4 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("19_R3"),
|
||||
"Requires server to be running 1.19.4+"
|
||||
);
|
||||
|
||||
/**
|
||||
@@ -57,17 +61,6 @@ public class Prerequisite {
|
||||
"Requires server to be running 1.18+"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running 1.17.
|
||||
*
|
||||
* @deprecated eco no longer supports versions before 1.17.
|
||||
*/
|
||||
@Deprecated(since = "6.25.2", forRemoval = true)
|
||||
public static final Prerequisite HAS_1_17 = new Prerequisite(
|
||||
() -> ProxyConstants.NMS_VERSION.contains("17") || HAS_1_18.isMet(),
|
||||
"Requires server to be running 1.17+"
|
||||
);
|
||||
|
||||
/**
|
||||
* Requires the server to be running an implementation of BungeeCord.
|
||||
*
|
||||
|
||||
@@ -14,7 +14,7 @@ import java.util.List;
|
||||
*
|
||||
* @deprecated Internal command implementations have been removed from the API.
|
||||
*/
|
||||
@Deprecated(forRemoval = true, since = "6.49.0")
|
||||
@Deprecated(since = "6.49.0", forRemoval = true)
|
||||
public final class DelegatedBukkitCommand extends Command implements TabCompleter, PluginIdentifiableCommand {
|
||||
/**
|
||||
* The delegate command.
|
||||
|
||||
@@ -16,6 +16,8 @@ import org.jetbrains.annotations.NotNull;
|
||||
*/
|
||||
public abstract class ExtendableConfig extends LoadableConfigWrapper {
|
||||
/**
|
||||
* Create a new extendable config.
|
||||
*
|
||||
* @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.
|
||||
|
||||
@@ -26,6 +26,8 @@ import java.util.Map;
|
||||
@Deprecated(since = "6.44.0", forRemoval = true)
|
||||
public class TransientConfig extends ConfigWrapper<Config> {
|
||||
/**
|
||||
* Create new transient config from bukkit config.
|
||||
*
|
||||
* @param config The ConfigurationSection handle.
|
||||
*/
|
||||
public TransientConfig(@NotNull final ConfigurationSection config) {
|
||||
@@ -42,6 +44,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a transient config from an input stream.
|
||||
*
|
||||
* @param stream The InputStream.
|
||||
*/
|
||||
public TransientConfig(@Nullable final InputStream stream) {
|
||||
@@ -51,15 +55,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
||||
}
|
||||
|
||||
/**
|
||||
* @param file The File.
|
||||
* @deprecated Specify the config type to prevent bugs.
|
||||
*/
|
||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
||||
public TransientConfig(@Nullable final File file) {
|
||||
this(file, ConfigType.YAML);
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a file to a config.
|
||||
*
|
||||
* @param file The file.
|
||||
* @param type The config type to try read from.
|
||||
*/
|
||||
@@ -97,6 +94,8 @@ public class TransientConfig extends ConfigWrapper<Config> {
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a config from a string.
|
||||
*
|
||||
* @param contents The contents of the config.
|
||||
* @param type The config type.
|
||||
*/
|
||||
|
||||
@@ -30,16 +30,6 @@ import java.util.Set;
|
||||
*/
|
||||
@SuppressWarnings("unused")
|
||||
public interface Config extends Cloneable, PlaceholderInjectable {
|
||||
/**
|
||||
* Clears cache.
|
||||
* <p>
|
||||
* Configs no longer have caches as they have in previous versions.
|
||||
*/
|
||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
||||
default void clearCache() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config into readable text.
|
||||
*
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.config.interfaces;
|
||||
|
||||
import org.bukkit.configuration.file.YamlConfiguration;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.IOException;
|
||||
@@ -44,21 +43,6 @@ public interface LoadableConfig extends Config {
|
||||
*/
|
||||
String getName();
|
||||
|
||||
/**
|
||||
* Get bukkit {@link YamlConfiguration}.
|
||||
* <p>
|
||||
* This used to represent the underlying config, but since 6.30.0 configs use
|
||||
* their own implementations internally, without relying on bukkit.
|
||||
*
|
||||
* @return The config, or null if config is not yaml-based.
|
||||
* @deprecated Use toBukkit() instead.
|
||||
*/
|
||||
@Nullable
|
||||
@Deprecated(since = "6.30.0", forRemoval = true)
|
||||
default YamlConfiguration getBukkitHandle() {
|
||||
return this.toBukkit();
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the config to a bukkit {@link YamlConfiguration}.
|
||||
*/
|
||||
|
||||
@@ -38,6 +38,9 @@ import java.lang.annotation.Target;
|
||||
* <p>
|
||||
* By having a plugin as a parameter, you shouldn't really need getInstance()
|
||||
* calls in your code.
|
||||
*
|
||||
* While flexible, this can lead to long initialization times, so this feature
|
||||
* can be disabled in eco.yml with the uses-reflective-reload option.
|
||||
*/
|
||||
@Retention(RetentionPolicy.RUNTIME)
|
||||
@Target(ElementType.METHOD)
|
||||
|
||||
@@ -19,7 +19,7 @@ import java.util.Set;
|
||||
*
|
||||
* @param <T> The type of the handle.
|
||||
*/
|
||||
@SuppressWarnings({"MethodDoesntCallSuperMethod", "removal"})
|
||||
@SuppressWarnings("MethodDoesntCallSuperMethod")
|
||||
public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
/**
|
||||
* Configs from eco have an internal implementation,
|
||||
@@ -42,12 +42,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
|
||||
this.handle = handle;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated(since = "6.31.1", forRemoval = true)
|
||||
public void clearCache() {
|
||||
handle.clearCache();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toPlaintext() {
|
||||
return handle.toPlaintext();
|
||||
|
||||
@@ -0,0 +1,85 @@
|
||||
package com.willfp.eco.core.data;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* A simple store key-value store for data to be stored outside of plugins.
|
||||
*/
|
||||
public final class ExternalDataStore {
|
||||
/**
|
||||
* The store.
|
||||
*/
|
||||
private static final HashMap<String, Object> data = new HashMap<>();
|
||||
|
||||
/**
|
||||
* Put data into the store.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param value The value.
|
||||
*/
|
||||
public static void put(@NotNull final String key,
|
||||
@NotNull final Object value) {
|
||||
data.put(key, value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get data from the store.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param clazz The class.
|
||||
* @param <T> The type.
|
||||
* @return The value.
|
||||
*/
|
||||
@Nullable
|
||||
public static <T> T get(@NotNull final String key,
|
||||
@NotNull final Class<T> clazz) {
|
||||
Object value = data.get(key);
|
||||
|
||||
if (clazz.isInstance(value)) {
|
||||
return clazz.cast(value);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get data from the store.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param clazz The class.
|
||||
* @param defaultValue The default value.
|
||||
* @param <T> The type.
|
||||
* @return The value.
|
||||
*/
|
||||
@NotNull
|
||||
public static <T> T get(@NotNull final String key,
|
||||
@NotNull final Class<T> clazz,
|
||||
@NotNull final T defaultValue) {
|
||||
T value = get(key, clazz);
|
||||
return value == null ? defaultValue : value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get data from the store.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param clazz The class.
|
||||
* @param defaultValue The default value.
|
||||
* @param <T> The type.
|
||||
* @return The value.
|
||||
*/
|
||||
@NotNull
|
||||
public static <T> T get(@NotNull final String key,
|
||||
@NotNull final Class<T> clazz,
|
||||
@NotNull final Supplier<T> defaultValue) {
|
||||
return get(key, clazz, defaultValue.get());
|
||||
}
|
||||
|
||||
private ExternalDataStore() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
@@ -82,44 +82,6 @@ public final class PersistentDataKey<T> {
|
||||
return this.type;
|
||||
}
|
||||
|
||||
/**
|
||||
* In older eco versions, keys would have to be categorized in order
|
||||
* to register the columns in the MySQL database. This is no longer needed.
|
||||
* <p>
|
||||
* Old description is below:
|
||||
* <p>
|
||||
* Categorize key as a server key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
||||
*/
|
||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
||||
public PersistentDataKey<T> server() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* In older eco versions, keys would have to be categorized in order
|
||||
* to register the columns in the MySQL database. This is no longer needed.
|
||||
* <p>
|
||||
* Old description is below:
|
||||
* <p>
|
||||
* Categorize key as a player key, will register new column to MySQL
|
||||
* database immediately rather than waiting for auto-categorization.
|
||||
* <p>
|
||||
* This will improve performance.
|
||||
*
|
||||
* @return The key.
|
||||
* @deprecated Not required since the new MySQL data handler was introduced.
|
||||
*/
|
||||
@Deprecated(since = "6.40.0", forRemoval = true)
|
||||
public PersistentDataKey<T> player() {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all persistent data keys.
|
||||
*
|
||||
|
||||
@@ -22,55 +22,38 @@ public final class PersistentDataKeyType<T> {
|
||||
/**
|
||||
* String.
|
||||
*/
|
||||
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>(String.class, "STRING");
|
||||
public static final PersistentDataKeyType<String> STRING = new PersistentDataKeyType<>("STRING");
|
||||
|
||||
/**
|
||||
* Boolean.
|
||||
*/
|
||||
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>(Boolean.class, "BOOLEAN");
|
||||
public static final PersistentDataKeyType<Boolean> BOOLEAN = new PersistentDataKeyType<>("BOOLEAN");
|
||||
|
||||
/**
|
||||
* Int.
|
||||
*/
|
||||
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>(Integer.class, "INT");
|
||||
public static final PersistentDataKeyType<Integer> INT = new PersistentDataKeyType<>("INT");
|
||||
|
||||
/**
|
||||
* Double.
|
||||
*/
|
||||
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>(Double.class, "DOUBLE");
|
||||
public static final PersistentDataKeyType<Double> DOUBLE = new PersistentDataKeyType<>("DOUBLE");
|
||||
|
||||
/**
|
||||
* String List.
|
||||
*/
|
||||
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>(null, "STRING_LIST");
|
||||
public static final PersistentDataKeyType<List<String>> STRING_LIST = new PersistentDataKeyType<>("STRING_LIST");
|
||||
|
||||
/**
|
||||
* Config.
|
||||
*/
|
||||
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>(Config.class, "CONFIG");
|
||||
|
||||
/**
|
||||
* The class of the type.
|
||||
*/
|
||||
private final Class<T> typeClass;
|
||||
public static final PersistentDataKeyType<Config> CONFIG = new PersistentDataKeyType<>("CONFIG");
|
||||
|
||||
/**
|
||||
* The name of the key type.
|
||||
*/
|
||||
private final String name;
|
||||
|
||||
/**
|
||||
* Get the class of the type.
|
||||
*
|
||||
* @return The class.
|
||||
* @deprecated String list type will return null.
|
||||
*/
|
||||
@Deprecated(since = "6.36.0", forRemoval = true)
|
||||
@Nullable
|
||||
public Class<T> getTypeClass() {
|
||||
return typeClass;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the name of the key type.
|
||||
*
|
||||
@@ -83,14 +66,11 @@ public final class PersistentDataKeyType<T> {
|
||||
/**
|
||||
* Create new PersistentDataKeyType.
|
||||
*
|
||||
* @param typeClass The type class.
|
||||
* @param name The name.
|
||||
*/
|
||||
private PersistentDataKeyType(@Nullable final Class<T> typeClass,
|
||||
@NotNull final String name) {
|
||||
private PersistentDataKeyType(@NotNull final String name) {
|
||||
VALUES.add(this);
|
||||
|
||||
this.typeClass = typeClass;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import com.willfp.eco.core.fast.FastItemStack;
|
||||
import com.willfp.eco.core.integrations.guidetection.GUIDetectionManager;
|
||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
@@ -18,6 +19,9 @@ import java.util.TreeMap;
|
||||
|
||||
/**
|
||||
* Utility class to manage client-side item display.
|
||||
* <p>
|
||||
* Packet display is not done on the main thread, so make sure
|
||||
* all your modules are thread-safe.
|
||||
*/
|
||||
public final class Display {
|
||||
/**
|
||||
@@ -71,7 +75,7 @@ public final class Display {
|
||||
ItemStack original = itemStack.clone();
|
||||
Inventory inventory = player == null ? null : player.getOpenInventory().getTopInventory();
|
||||
boolean inInventory = inventory != null && inventory.contains(original);
|
||||
boolean inGui = inventory != null && inventory.getHolder() == null;
|
||||
boolean inGui = player != null && GUIDetectionManager.hasGUIOpen(player);
|
||||
|
||||
DisplayProperties properties = new DisplayProperties(
|
||||
inInventory,
|
||||
|
||||
@@ -8,6 +8,8 @@ import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Class for all plugin-specific client-side item display modules.
|
||||
* <p>
|
||||
* Display modules are called in the netty thread, so make sure they are thread-safe.
|
||||
*/
|
||||
public abstract class DisplayModule {
|
||||
/**
|
||||
@@ -110,23 +112,6 @@ public abstract class DisplayModule {
|
||||
return this.getPlugin().getName();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display priority.
|
||||
*
|
||||
* @return The priority.
|
||||
* @deprecated Use getWeight instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public DisplayPriority getPriority() {
|
||||
return switch (this.weight) {
|
||||
case 100 -> DisplayPriority.LOWEST;
|
||||
case 200 -> DisplayPriority.LOW;
|
||||
case 300 -> DisplayPriority.HIGH;
|
||||
case 400 -> DisplayPriority.HIGHEST;
|
||||
default -> DisplayPriority.CUSTOM;
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the display weight.
|
||||
*
|
||||
|
||||
@@ -6,7 +6,10 @@ package com.willfp.eco.core.display;
|
||||
public enum DisplayPriority {
|
||||
/**
|
||||
* Custom weight.
|
||||
*
|
||||
* @deprecated Will never be used.
|
||||
*/
|
||||
@Deprecated(since = "6.53.0", forRemoval = true)
|
||||
CUSTOM(250),
|
||||
|
||||
/**
|
||||
|
||||
@@ -20,6 +20,13 @@ public abstract class CustomGoal<T extends Mob> implements EntityGoal<T>, Target
|
||||
*/
|
||||
private final Set<GoalFlag> flags = EnumSet.noneOf(GoalFlag.class);
|
||||
|
||||
/**
|
||||
* Create a new custom goal.
|
||||
*/
|
||||
protected CustomGoal() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize the goal with a mob.
|
||||
* <p>
|
||||
|
||||
@@ -13,10 +13,10 @@ import org.jetbrains.annotations.Nullable;
|
||||
/**
|
||||
* Avoid entities.
|
||||
*
|
||||
* @param entity The entity type to avoid.
|
||||
* @param distance The distance to flee to.
|
||||
* @param slowSpeed The slow movement speed.
|
||||
* @param fastSpeed The fast movement speed.
|
||||
* @param entity The entity type to avoid.
|
||||
* @param distance The distance to flee to.
|
||||
* @param slowSpeed The slow movement speed.
|
||||
* @param fastSpeed The fast movement speed.
|
||||
*/
|
||||
public record EntityGoalAvoidEntity(
|
||||
@NotNull TestableEntity entity,
|
||||
@@ -45,23 +45,14 @@ public record EntityGoalAvoidEntity(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
TestableEntity entity = Entities.lookup(config.getString("entity"));
|
||||
TestableEntity entity = Entities.lookup(config.getString("entity"));
|
||||
|
||||
return new EntityGoalAvoidEntity(
|
||||
entity,
|
||||
config.getDouble("distance"),
|
||||
config.getDouble("slowSpeed"),
|
||||
config.getDouble("fastSpeed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalAvoidEntity(
|
||||
entity,
|
||||
config.getDouble("distance"),
|
||||
config.getDouble("slowSpeed"),
|
||||
config.getDouble("fastSpeed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalBreakDoors(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalBreakDoors(
|
||||
config.getInt("ticks")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalBreakDoors(
|
||||
config.getInt("ticks")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalBreed(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalBreed(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalBreed(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalCatLieOnBed(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalCatLieOnBed(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("range")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalCatLieOnBed(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("range")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalCatSitOnBed(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalCatSitOnBed(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalCatSitOnBed(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalFleeSun(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalFleeSun(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalFleeSun(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -40,20 +40,11 @@ public record EntityGoalFollowMobs(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalFollowMobs(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("minDistance"),
|
||||
config.getDouble("maxDistance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalFollowMobs(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("minDistance"),
|
||||
config.getDouble("maxDistance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -42,20 +42,11 @@ public record EntityGoalInteract(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalInteract(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getDouble("range"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalInteract(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getDouble("range"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalLeapAtTarget(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalLeapAtTarget(
|
||||
config.getDouble("velocity")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalLeapAtTarget(
|
||||
config.getDouble("velocity")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalLookAtPlayer(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalLookAtPlayer(
|
||||
config.getDouble("range"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalLookAtPlayer(
|
||||
config.getDouble("range"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalMeleeAttack(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalMeleeAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("pauseWhenMobIdle")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalMeleeAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("pauseWhenMobIdle")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalMoveBackToVillage(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalMoveBackToVillage(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("canDespawn")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalMoveBackToVillage(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("canDespawn")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -43,21 +43,12 @@ public record EntityGoalMoveThroughVillage(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalMoveThroughVillage(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("onlyAtNight"),
|
||||
config.getInt("distance"),
|
||||
config.getBool("canPassThroughDoors")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalMoveThroughVillage(
|
||||
config.getDouble("speed"),
|
||||
config.getBool("onlyAtNight"),
|
||||
config.getInt("distance"),
|
||||
config.getBool("canPassThroughDoors")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalMoveTowardsRestriction(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalMoveTowardsRestriction(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalMoveTowardsRestriction(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalMoveTowardsTarget(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalMoveTowardsTarget(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("maxDistance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalMoveTowardsTarget(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("maxDistance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalOpenDoors(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalOpenDoors(
|
||||
config.getBool("delayClosing")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalOpenDoors(
|
||||
config.getBool("delayClosing")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalPanic(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalPanic(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalPanic(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -40,20 +40,11 @@ public record EntityGoalRandomStroll(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalRandomStroll(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval"),
|
||||
config.getBool("canDespawn")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalRandomStroll(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval"),
|
||||
config.getBool("canDespawn")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalRandomSwimming(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalRandomSwimming(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalRandomSwimming(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -45,21 +45,12 @@ public record EntityGoalRangedAttack(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalRangedAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("minInterval"),
|
||||
config.getInt("maxInterval"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalRangedAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("minInterval"),
|
||||
config.getInt("maxInterval"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -13,9 +13,9 @@ import org.jetbrains.annotations.Nullable;
|
||||
* <p>
|
||||
* Only supports monsters that have bow attacks.
|
||||
*
|
||||
* @param speed The speed.
|
||||
* @param speed The speed.
|
||||
* @param interval The interval between attacks (in ticks).
|
||||
* @param range The max range at which to attack.
|
||||
* @param range The max range at which to attack.
|
||||
*/
|
||||
public record EntityGoalRangedBowAttack(
|
||||
double speed,
|
||||
@@ -42,20 +42,11 @@ public record EntityGoalRangedBowAttack(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalRangedBowAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalRangedBowAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getInt("interval"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -39,19 +39,10 @@ public record EntityGoalRangedCrossbowAttack(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalRangedCrossbowAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalRangedCrossbowAttack(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("range")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalStrollThroughVillage(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalStrollThroughVillage(
|
||||
config.getInt("searchRange")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalStrollThroughVillage(
|
||||
config.getInt("searchRange")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -28,6 +28,8 @@ public record EntityGoalTempt(
|
||||
boolean canBeScared
|
||||
) implements EntityGoal<Mob> {
|
||||
/**
|
||||
* Create a new entity goal.
|
||||
*
|
||||
* @param speed The speed at which the entity follows the item.
|
||||
* @param item The item that the entity will be attracted by.
|
||||
* @param canBeScared If the entity can be scared and lose track of the item.
|
||||
@@ -58,25 +60,16 @@ public record EntityGoalTempt(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
Collection<TestableItem> items = config.getStrings("items").stream()
|
||||
.map(Items::lookup)
|
||||
.filter(it -> !(it instanceof EmptyTestableItem))
|
||||
.collect(Collectors.toList());
|
||||
Collection<TestableItem> items = config.getStrings("items").stream()
|
||||
.map(Items::lookup)
|
||||
.filter(it -> !(it instanceof EmptyTestableItem))
|
||||
.collect(Collectors.toList());
|
||||
|
||||
return new EntityGoalTempt(
|
||||
config.getDouble("speed"),
|
||||
items,
|
||||
config.getBool("canBeScared")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalTempt(
|
||||
config.getDouble("speed"),
|
||||
items,
|
||||
config.getBool("canBeScared")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -48,22 +48,13 @@ public record EntityGoalUseItem(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
TestableEntity filter = Entities.lookup(config.getString("condition"));
|
||||
TestableEntity filter = Entities.lookup(config.getString("condition"));
|
||||
|
||||
return new EntityGoalUseItem(
|
||||
Items.lookup(config.getString("item")).getItem(),
|
||||
Sound.valueOf(config.getString("sound").toUpperCase()),
|
||||
filter::matches
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalUseItem(
|
||||
Items.lookup(config.getString("item")).getItem(),
|
||||
Sound.valueOf(config.getString("sound").toUpperCase()),
|
||||
filter::matches
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalWaterAvoidingRandomFlying(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalWaterAvoidingRandomFlying(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalWaterAvoidingRandomFlying(
|
||||
config.getDouble("speed")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,19 +37,10 @@ public record EntityGoalWaterAvoidingRandomStroll(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalWaterAvoidingRandomStroll(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalWaterAvoidingRandomStroll(
|
||||
config.getDouble("speed"),
|
||||
config.getDouble("chance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -34,18 +34,9 @@ public record EntityGoalWolfBeg(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new EntityGoalWolfBeg(
|
||||
config.getDouble("distance")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new EntityGoalWolfBeg(
|
||||
config.getDouble("distance")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -37,18 +37,9 @@ public record TargetGoalHurtBy(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new TargetGoalHurtBy(
|
||||
Entities.lookup(config.getString("blacklist"))
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new TargetGoalHurtBy(
|
||||
Entities.lookup(config.getString("blacklist"))
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackable(
|
||||
@NotNull Predicate<LivingEntity> targetFilter
|
||||
) implements TargetGoal<Raider> {
|
||||
/**
|
||||
* Create a new target goal.
|
||||
*
|
||||
* @param target The type of entities to attack.
|
||||
* @param checkVisibility If visibility should be checked.
|
||||
* @param checkCanNavigate If navigation should be checked.
|
||||
@@ -63,32 +65,23 @@ public record TargetGoalNearestAttackable(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
|
||||
return new TargetGoalNearestAttackable(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestAttackable(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance")
|
||||
);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
return new TargetGoalNearestAttackable(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestAttackable(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -30,6 +30,8 @@ public record TargetGoalNearestAttackableWitch(
|
||||
@NotNull Predicate<LivingEntity> targetFilter
|
||||
) implements TargetGoal<Raider> {
|
||||
/**
|
||||
* Create a new target goal.
|
||||
*
|
||||
* @param target The type of entities to attack.
|
||||
* @param checkVisibility If visibility should be checked.
|
||||
* @param checkCanNavigate If navigation should be checked.
|
||||
@@ -63,32 +65,23 @@ public record TargetGoalNearestAttackableWitch(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
|
||||
return new TargetGoalNearestAttackableWitch(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestAttackableWitch(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance")
|
||||
);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
return new TargetGoalNearestAttackableWitch(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestAttackableWitch(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
config.getBool("checkCanNavigate"),
|
||||
config.getInt("reciprocalChance")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@ public record TargetGoalNearestHealableRaider(
|
||||
@NotNull Predicate<LivingEntity> targetFilter
|
||||
) implements TargetGoal<Raider> {
|
||||
/**
|
||||
* Create a new target goal.
|
||||
*
|
||||
* @param target The target.
|
||||
* @param checkVisibility If visibility should be checked.
|
||||
*/
|
||||
@@ -53,28 +55,19 @@ public record TargetGoalNearestHealableRaider(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
|
||||
return new TargetGoalNearestHealableRaider(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestHealableRaider(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility")
|
||||
);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
return new TargetGoalNearestHealableRaider(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNearestHealableRaider(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -26,6 +26,8 @@ public record TargetGoalNonTameRandom(
|
||||
@NotNull Predicate<LivingEntity> targetFilter
|
||||
) implements TargetGoal<Tameable> {
|
||||
/**
|
||||
* Create a new target goal.
|
||||
*
|
||||
* @param target The types of entities to heal.
|
||||
* @param checkVisibility If visibility should be checked.
|
||||
*/
|
||||
@@ -53,28 +55,19 @@ public record TargetGoalNonTameRandom(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
if (config.has("targetFilter")) {
|
||||
TestableEntity filter = Entities.lookup(config.getString("targetFilter"));
|
||||
|
||||
return new TargetGoalNonTameRandom(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNonTameRandom(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility")
|
||||
);
|
||||
}
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
return new TargetGoalNonTameRandom(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility"),
|
||||
filter::matches
|
||||
);
|
||||
} else {
|
||||
return new TargetGoalNonTameRandom(
|
||||
Entities.lookup(config.getString("target")),
|
||||
config.getBool("checkVisibility")
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,18 +36,9 @@ public record TargetGoalResetUniversalAnger(
|
||||
return null;
|
||||
}
|
||||
|
||||
try {
|
||||
return new TargetGoalResetUniversalAnger(
|
||||
config.getBool("triggerOthers")
|
||||
);
|
||||
} catch (Exception e) {
|
||||
/*
|
||||
Exceptions could be caused by configs having values of a wrong type,
|
||||
invalid enum parameters, etc. Serializers shouldn't throw exceptions,
|
||||
so we encapsulate them as null.
|
||||
*/
|
||||
return null;
|
||||
}
|
||||
return new TargetGoalResetUniversalAnger(
|
||||
config.getBool("triggerOthers")
|
||||
);
|
||||
}
|
||||
|
||||
@NotNull
|
||||
|
||||
@@ -7,6 +7,8 @@ import java.util.function.Consumer;
|
||||
import java.util.function.Predicate;
|
||||
|
||||
/**
|
||||
* The result of an arg parses.
|
||||
*
|
||||
* @param test The test for the entity.
|
||||
* @param modifier The modifier to apply to the entity.
|
||||
* @see EntityArgParser
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.willfp.eco.core.events;
|
||||
|
||||
import com.willfp.eco.core.packet.PacketListener;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -25,4 +26,11 @@ public interface EventManager {
|
||||
* Unregister all listeners associated with the plugin.
|
||||
*/
|
||||
void unregisterAllListeners();
|
||||
|
||||
/**
|
||||
* Register a packet listener.
|
||||
*
|
||||
* @param listener The listener.
|
||||
*/
|
||||
void registerPacketListener(@NotNull PacketListener listener);
|
||||
}
|
||||
|
||||
@@ -20,18 +20,6 @@ import java.util.Set;
|
||||
* FastItemStack contains methods to modify and read items faster than in default bukkit.
|
||||
*/
|
||||
public interface FastItemStack extends PersistentDataHolder {
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
*
|
||||
* @param checkStored If stored NBT should also be checked.
|
||||
* @return A map of all enchantments.
|
||||
* @deprecated Poorly named method. Use getEnchants instead.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
default Map<Enchantment, Integer> getEnchantmentsOnItem(boolean checkStored) {
|
||||
return getEnchants(checkStored);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all enchantments on an item.
|
||||
* Does not account for stored enchants.
|
||||
@@ -51,33 +39,6 @@ public interface FastItemStack extends PersistentDataHolder {
|
||||
@NotNull
|
||||
Map<Enchantment, Integer> getEnchants(boolean checkStored);
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
||||
*/
|
||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
||||
default int getLevelOnItem(@NotNull Enchantment enchantment) {
|
||||
return getEnchantmentLevel(enchantment, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment on an item.
|
||||
*
|
||||
* @param enchantment The enchantment.
|
||||
* @param checkStored If the stored NBT should also be checked.
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
* @deprecated Poorly named method. Use getEnchantmentLevel instead.
|
||||
*/
|
||||
@Deprecated(since = "6.34.0", forRemoval = true)
|
||||
@SuppressWarnings("DeprecatedIsStillUsed")
|
||||
default int getLevelOnItem(@NotNull Enchantment enchantment,
|
||||
boolean checkStored) {
|
||||
return getEnchantmentLevel(enchantment, checkStored);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the level of an enchantment.
|
||||
*
|
||||
@@ -85,7 +46,7 @@ public interface FastItemStack extends PersistentDataHolder {
|
||||
* @return The enchantment level, or 0 if not found.
|
||||
*/
|
||||
default int getEnchantmentLevel(@NotNull Enchantment enchantment) {
|
||||
return getLevelOnItem(enchantment, false);
|
||||
return getEnchantmentLevel(enchantment, false);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -3,20 +3,15 @@ package com.willfp.eco.core.gui.menu;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.gui.page.Page;
|
||||
import com.willfp.eco.core.gui.slot.Slot;
|
||||
import com.willfp.eco.util.NamespacedKeyUtils;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.Inventory;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* GUI version of {@link Inventory}.
|
||||
@@ -240,58 +235,6 @@ public interface Menu {
|
||||
return Objects.requireNonNullElse(pageState, Integer.MAX_VALUE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Write data.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param type The type.
|
||||
* @param value The value.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @deprecated Use addState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default <T, Z> void writeData(@NotNull final Player player,
|
||||
@NotNull final NamespacedKey key,
|
||||
@NotNull final PersistentDataType<T, Z> type,
|
||||
@NotNull final Z value) {
|
||||
this.setState(player, key.toString(), value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Read data.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param key The key.
|
||||
* @param type The type.
|
||||
* @param <T> The type.
|
||||
* @param <Z> The type.
|
||||
* @return The data.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default @Nullable <T, Z> T readData(@NotNull final Player player,
|
||||
@NotNull final NamespacedKey key,
|
||||
@NotNull final PersistentDataType<T, Z> type) {
|
||||
return this.getState(player, key.toString());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all data keys for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The keys.
|
||||
* @deprecated Use getState instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default Set<NamespacedKey> getKeys(@NotNull final Player player) {
|
||||
return this.getState(player).keySet().stream()
|
||||
.map(NamespacedKeyUtils::fromStringOrNull)
|
||||
.filter(Objects::nonNull)
|
||||
.collect(Collectors.toSet());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a builder with a given amount of rows.
|
||||
*
|
||||
|
||||
@@ -90,17 +90,4 @@ public abstract class CustomSlot implements Slot {
|
||||
public final Slot getSlotAt(int row, int column) {
|
||||
return Slot.super.getSlotAt(row, column);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the delegate slot.
|
||||
* <p>
|
||||
* This is not required to add the slot to a menu, but is instead used internally.
|
||||
*
|
||||
* @return The slot.
|
||||
* @deprecated Replaced with {@link Slot#getActionableSlot(Player, Menu)}
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
public Slot getDelegate() {
|
||||
return this.delegate;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -158,27 +158,4 @@ public interface Slot extends GUIComponent {
|
||||
static SlotBuilder builder(@NotNull final SlotProvider provider) {
|
||||
return Eco.get().createSlotBuilder(provider);
|
||||
}
|
||||
|
||||
/**
|
||||
* If the slot is not captive for a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If not captive for the player.
|
||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
default boolean isNotCaptiveFor(@NotNull Player player) {
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* If the slot is captive. (Can items be placed in it).
|
||||
*
|
||||
* @return If captive.
|
||||
* @deprecated Captivity is now reactive, this method can produce incorrect results.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
default boolean isCaptive() {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.afk;
|
||||
|
||||
/**
|
||||
* Wrapper class for afk integrations.
|
||||
*
|
||||
* @deprecated Use AFKIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AFKWrapper extends AFKIntegration {
|
||||
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Listener;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -18,19 +17,6 @@ public final class AnticheatManager {
|
||||
*/
|
||||
private static final Set<AnticheatIntegration> ANTICHEATS = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new anticheat.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
* @param anticheat The anticheat to register.
|
||||
* @deprecated Don't pass instance of eco.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public static void register(@NotNull final EcoPlugin plugin,
|
||||
@NotNull final AnticheatIntegration anticheat) {
|
||||
register(anticheat);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a new anticheat.
|
||||
*
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.anticheat;
|
||||
|
||||
/**
|
||||
* Wrapper class for anticheat integrations.
|
||||
*
|
||||
* @deprecated Use AnticheatIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AnticheatWrapper extends AnticheatIntegration {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.antigrief;
|
||||
|
||||
/**
|
||||
* Wrapper class for antigrief integrations.
|
||||
*
|
||||
* @deprecated Use AntigriefIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface AntigriefWrapper extends AntigriefIntegration {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.customentities;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*
|
||||
* @deprecated Use CustomEntitiesIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface CustomEntitiesWrapper extends CustomEntitiesIntegration {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.customitems;
|
||||
|
||||
/**
|
||||
* Wrapper class for custom item integrations.
|
||||
*
|
||||
* @deprecated Use CustomItemsIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface CustomItemsWrapper extends CustomItemsIntegration {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.economy;
|
||||
|
||||
/**
|
||||
* Wrapper class for economy integrations.
|
||||
*
|
||||
* @deprecated Use EconomyIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface EconomyWrapper extends EconomyIntegration {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.core.integrations.guidetection;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Wrapper class for GUI integrations.
|
||||
*/
|
||||
public interface GUIDetectionIntegration extends Integration {
|
||||
/**
|
||||
* Determine if a player is in a GUI.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If the player is in a GUI.
|
||||
*/
|
||||
boolean hasGUIOpen(@NotNull final Player player);
|
||||
}
|
||||
@@ -0,0 +1,52 @@
|
||||
package com.willfp.eco.core.integrations.guidetection;
|
||||
|
||||
import com.willfp.eco.util.MenuUtils;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Class to handle GUI detection.
|
||||
*/
|
||||
public final class GUIDetectionManager {
|
||||
/**
|
||||
* A set of all registered integrations.
|
||||
*/
|
||||
private static final Set<GUIDetectionIntegration> REGISTERED = new HashSet<>();
|
||||
|
||||
/**
|
||||
* Register a new integration.
|
||||
*
|
||||
* @param integration The integration to register.
|
||||
*/
|
||||
public static void register(@NotNull final GUIDetectionIntegration integration) {
|
||||
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(integration.getPluginName()));
|
||||
REGISTERED.add(integration);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if a player is in a GUI.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return If the player has a GUI open.
|
||||
*/
|
||||
public static boolean hasGUIOpen(@NotNull final Player player) {
|
||||
if (MenuUtils.getOpenMenu(player) != null) {
|
||||
return true;
|
||||
}
|
||||
|
||||
for (GUIDetectionIntegration integration : REGISTERED) {
|
||||
if (integration.hasGUIOpen(player)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private GUIDetectionManager() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.hologram;
|
||||
|
||||
/**
|
||||
* Wrapper class for hologram integrations.
|
||||
*
|
||||
* @deprecated Use HologramIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface HologramWrapper extends HologramIntegration {
|
||||
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.mcmmo;
|
||||
|
||||
/**
|
||||
* Wrapper class for mcmmo integrations.
|
||||
*
|
||||
* @deprecated Use McmmoIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface McmmoWrapper extends McmmoIntegration {
|
||||
|
||||
}
|
||||
@@ -1,190 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.placeholder;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.placeholder.Placeholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Objects;
|
||||
import java.util.function.Function;
|
||||
|
||||
/**
|
||||
* A placeholder entry is a placeholder in and of itself.
|
||||
* <p>
|
||||
* It should be fairly straightforward.
|
||||
*
|
||||
* @deprecated Confusing functionality with inconsistent nullability and poor naming.
|
||||
*/
|
||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
||||
public class PlaceholderEntry {
|
||||
/**
|
||||
* The name of the placeholder, used in lookups.
|
||||
*/
|
||||
private final String identifier;
|
||||
|
||||
/**
|
||||
* The lambda to retrieve the output of the placeholder given a player.
|
||||
*/
|
||||
private final Function<Player, String> function;
|
||||
|
||||
/**
|
||||
* If the placeholder requires a player to lookup.
|
||||
*/
|
||||
private final boolean requiresPlayer;
|
||||
|
||||
/**
|
||||
* The plugin for the placeholder.
|
||||
*/
|
||||
@Nullable
|
||||
private final EcoPlugin plugin;
|
||||
|
||||
/**
|
||||
* Create a placeholder entry that doesn't require a player.
|
||||
*
|
||||
* @param identifier The identifier of the placeholder.
|
||||
* @param function A lambda to get the result of the placeholder given a player.
|
||||
* @deprecated Specify a plugin.
|
||||
*/
|
||||
@Deprecated
|
||||
public PlaceholderEntry(@NotNull final String identifier,
|
||||
@NotNull final Function<Player, String> function) {
|
||||
this(identifier, function, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a placeholder entry that may require a player.
|
||||
*
|
||||
* @param identifier The identifier of the placeholder.
|
||||
* @param function A lambda to get the result of the placeholder.
|
||||
* @param requiresPlayer If the placeholder requires a player.
|
||||
* @deprecated Specify a plugin.
|
||||
*/
|
||||
@Deprecated
|
||||
public PlaceholderEntry(@NotNull final String identifier,
|
||||
@NotNull final Function<Player, String> function,
|
||||
final boolean requiresPlayer) {
|
||||
this(null, identifier, function, requiresPlayer);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a placeholder entry that doesn't require a player.
|
||||
*
|
||||
* @param plugin The plugin for the placeholder.
|
||||
* @param identifier The identifier of the placeholder.
|
||||
* @param function A lambda to get the result of the placeholder given a player.
|
||||
*/
|
||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
||||
@NotNull final String identifier,
|
||||
@NotNull final Function<Player, String> function) {
|
||||
this(plugin, identifier, function, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a placeholder entry that may require a player.
|
||||
*
|
||||
* @param plugin The plugin for the placeholder.
|
||||
* @param identifier The identifier of the placeholder.
|
||||
* @param function A lambda to get the result of the placeholder.
|
||||
* @param requiresPlayer If the placeholder requires a player.
|
||||
*/
|
||||
public PlaceholderEntry(@Nullable final EcoPlugin plugin,
|
||||
@NotNull final String identifier,
|
||||
@NotNull final Function<Player, String> function,
|
||||
final boolean requiresPlayer) {
|
||||
this.plugin = plugin;
|
||||
this.identifier = identifier;
|
||||
this.function = function;
|
||||
this.requiresPlayer = requiresPlayer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the result of the placeholder with respect to a player.
|
||||
*
|
||||
* @param player The player to translate with respect to.
|
||||
* @return The result of the placeholder.
|
||||
*/
|
||||
public String getResult(@Nullable final Player player) {
|
||||
if (player == null) {
|
||||
Validate.isTrue(!requiresPlayer, "null player passed to requiresPlayer placeholder.");
|
||||
}
|
||||
return this.function.apply(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if the placeholder requires a player to get a result.
|
||||
*
|
||||
* @return If the placeholder requires a player.
|
||||
*/
|
||||
public boolean requiresPlayer() {
|
||||
return requiresPlayer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the identifier.
|
||||
*
|
||||
* @return The identifier.
|
||||
*/
|
||||
public String getIdentifier() {
|
||||
return identifier;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin.
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
public EcoPlugin getPlugin() {
|
||||
return plugin;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register the placeholder.
|
||||
*/
|
||||
public void register() {
|
||||
PlaceholderManager.registerPlaceholder(this.toModernPlaceholder());
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert the placeholder to a modern placeholder.
|
||||
*
|
||||
* @return The placeholder.
|
||||
*/
|
||||
Placeholder toModernPlaceholder() {
|
||||
if (this.requiresPlayer) {
|
||||
return new PlayerPlaceholder(
|
||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
||||
identifier,
|
||||
function
|
||||
);
|
||||
} else {
|
||||
return new PlayerlessPlaceholder(
|
||||
Objects.requireNonNullElse(plugin, Eco.get().getEcoPlugin()),
|
||||
identifier,
|
||||
() -> function.apply(null)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean equals(@Nullable final Object o) {
|
||||
if (this == o) {
|
||||
return true;
|
||||
}
|
||||
if (!(o instanceof PlaceholderEntry entry)) {
|
||||
return false;
|
||||
}
|
||||
return Objects.equals(this.getIdentifier(), entry.getIdentifier())
|
||||
&& Objects.equals(this.getPlugin(), entry.getPlugin());
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
return Objects.hash(this.getIdentifier(), this.getPlugin());
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,6 @@ package com.willfp.eco.core.integrations.placeholder;
|
||||
import com.github.benmanes.caffeine.cache.Cache;
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.placeholder.AdditionalPlayer;
|
||||
import com.willfp.eco.core.placeholder.DynamicPlaceholder;
|
||||
@@ -16,6 +15,7 @@ import com.willfp.eco.core.placeholder.PlayerStaticPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.PlayerlessPlaceholder;
|
||||
import com.willfp.eco.core.placeholder.StaticPlaceholder;
|
||||
import com.willfp.eco.util.StringUtils;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -36,7 +36,6 @@ import java.util.regex.Pattern;
|
||||
/**
|
||||
* Class to handle placeholder integrations.
|
||||
*/
|
||||
@SuppressWarnings("removal")
|
||||
public final class PlaceholderManager {
|
||||
/**
|
||||
* All registered placeholders.
|
||||
@@ -78,6 +77,11 @@ public final class PlaceholderManager {
|
||||
* Empty injectable object.
|
||||
*/
|
||||
public static final PlaceholderInjectable EMPTY_INJECTABLE = new PlaceholderInjectable() {
|
||||
@Override
|
||||
public void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clearInjectedPlaceholders() {
|
||||
// Do nothing.
|
||||
@@ -110,25 +114,12 @@ public final class PlaceholderManager {
|
||||
throw new IllegalArgumentException("Static placeholders cannot be registered!");
|
||||
}
|
||||
|
||||
EcoPlugin plugin = placeholder.getPlugin() == null ? Eco.get().getEcoPlugin() : placeholder.getPlugin();
|
||||
|
||||
Map<Pattern, Placeholder> pluginPlaceholders = REGISTERED_PLACEHOLDERS
|
||||
.getOrDefault(plugin, new HashMap<>());
|
||||
.getOrDefault(placeholder.getPlugin(), new HashMap<>());
|
||||
|
||||
pluginPlaceholders.put(placeholder.getPattern(), placeholder);
|
||||
|
||||
REGISTERED_PLACEHOLDERS.put(plugin, pluginPlaceholders);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register a placeholder.
|
||||
*
|
||||
* @param placeholder The placeholder to register.
|
||||
* @deprecated Uses old placeholder system.
|
||||
*/
|
||||
@Deprecated(since = "6.28.0", forRemoval = true)
|
||||
public static void registerPlaceholder(@NotNull final PlaceholderEntry placeholder) {
|
||||
registerPlaceholder(placeholder.toModernPlaceholder());
|
||||
REGISTERED_PLACEHOLDERS.put(placeholder.getPlugin(), pluginPlaceholders);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -139,10 +130,11 @@ public final class PlaceholderManager {
|
||||
* @return The value of the placeholder.
|
||||
* @deprecated Specify a plugin to get the result from.
|
||||
*/
|
||||
@Deprecated
|
||||
@Deprecated(since = "6.52.2", forRemoval = true)
|
||||
@SuppressWarnings("unused")
|
||||
public static String getResult(@Nullable final Player player,
|
||||
@NotNull final String identifier) {
|
||||
return getResult(player, identifier, null);
|
||||
throw new UnsupportedOperationException("Please specify a plugin to get the result from!");
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -156,34 +148,21 @@ public final class PlaceholderManager {
|
||||
@NotNull
|
||||
public static String getResult(@Nullable final Player player,
|
||||
@NotNull final String identifier,
|
||||
@Nullable final EcoPlugin plugin) {
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
Validate.notNull(plugin, "Plugin cannot be null!");
|
||||
|
||||
// This is really janky, and it sucks, but it works so?
|
||||
// Compensating for regex being slow so that's why we get it.
|
||||
Placeholder placeholder = PLACEHOLDER_LOOKUP_CACHE.get(
|
||||
new PlaceholderLookup(identifier, plugin),
|
||||
(it) -> {
|
||||
EcoPlugin owner = plugin == null ? Eco.get().getEcoPlugin() : plugin;
|
||||
|
||||
// I hate the streams API.
|
||||
Optional<Placeholder> found = REGISTERED_PLACEHOLDERS
|
||||
.getOrDefault(owner, new HashMap<>())
|
||||
return REGISTERED_PLACEHOLDERS
|
||||
.getOrDefault(plugin, new HashMap<>())
|
||||
.entrySet()
|
||||
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
||||
.map(Map.Entry::getValue)
|
||||
.findFirst();
|
||||
|
||||
if (found.isEmpty() && plugin != null) {
|
||||
// Here we go again! Something about legacy support? I don't remember.
|
||||
// I won't touch it though, I'm scared of the placeholder system.
|
||||
found = REGISTERED_PLACEHOLDERS
|
||||
.getOrDefault(Eco.get().getEcoPlugin(), new HashMap<>())
|
||||
.entrySet()
|
||||
.stream().filter(entry -> entry.getKey().matcher(identifier).matches())
|
||||
.map(Map.Entry::getValue)
|
||||
.findFirst();
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
).orElse(null);
|
||||
|
||||
@@ -231,22 +210,6 @@ public final class PlaceholderManager {
|
||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate all placeholders with respect to a player.
|
||||
*
|
||||
* @param text The text that may contain placeholders to translate.
|
||||
* @param player The player to translate the placeholders with respect to.
|
||||
* @param statics Extra static placeholders.
|
||||
* @return The text, translated.
|
||||
* @deprecated Use new static system.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public static String translatePlaceholders(@NotNull final String text,
|
||||
@Nullable final Player player,
|
||||
@NotNull final List<StaticPlaceholder> statics) {
|
||||
return translatePlaceholders(text, player, EMPTY_INJECTABLE);
|
||||
}
|
||||
|
||||
/**
|
||||
* Translate all placeholders with respect to a player.
|
||||
*
|
||||
@@ -276,6 +239,35 @@ public final class PlaceholderManager {
|
||||
@NotNull final Collection<AdditionalPlayer> additionalPlayers) {
|
||||
String processed = text;
|
||||
|
||||
/*
|
||||
|
||||
Why am I doing statics at the start, but player statics at the end?
|
||||
|
||||
Additional players let you use something like victim as a player to parse in relation to,
|
||||
for example doing %victim_player_health%, which would parse the health of the victim.
|
||||
|
||||
However, something like libreforge will also inject %victim_max_health%, which is unrelated
|
||||
to additional players, and instead holds a constant value. So, eco saw this, smartly thought
|
||||
"ah, it's an additional player, let's parse it", and then tried to parse %max_health% with
|
||||
relation to the victim, which resolved to zero. So, we have to parse statics and player statics
|
||||
that might include a prefix first, then additional players, then player statics with the support
|
||||
of additional players.
|
||||
|
||||
This was a massive headache and took so many reports before I clocked what was going on.
|
||||
|
||||
Oh well, at least it's fixed now.
|
||||
|
||||
*/
|
||||
|
||||
|
||||
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||
if (injection instanceof StaticPlaceholder placeholder) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
||||
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||
}
|
||||
}
|
||||
|
||||
// Prevent running 2 scans if there are no additional players.
|
||||
if (!additionalPlayers.isEmpty()) {
|
||||
List<String> found = findPlaceholdersIn(text);
|
||||
@@ -297,19 +289,23 @@ public final class PlaceholderManager {
|
||||
}
|
||||
}
|
||||
|
||||
// Only run jank code if there are no integrations.
|
||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||
processed = setWithoutIntegration(processed, player);
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
processed = integration.translate(processed, player);
|
||||
}
|
||||
|
||||
// DON'T REMOVE THIS, IT'S NOT DUPLICATE CODE.
|
||||
for (InjectablePlaceholder injection : context.getPlaceholderInjections()) {
|
||||
// Do I know this is a bad way of doing this? Yes.
|
||||
// I know it's deprecated, but it's fast.
|
||||
if (injection instanceof StaticPlaceholder placeholder) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue());
|
||||
} else if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||
if (injection instanceof PlayerStaticPlaceholder placeholder && player != null) {
|
||||
processed = processed.replace("%" + placeholder.getIdentifier() + "%", placeholder.getValue(player));
|
||||
}
|
||||
}
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
@@ -322,12 +318,9 @@ public final class PlaceholderManager {
|
||||
public static List<String> findPlaceholdersIn(@NotNull final String text) {
|
||||
Set<String> found = new HashSet<>();
|
||||
|
||||
// Mock PAPI for those without it installed
|
||||
if (REGISTERED_INTEGRATIONS.isEmpty()) {
|
||||
Matcher matcher = PATTERN.matcher(text);
|
||||
while (matcher.find()) {
|
||||
found.add(matcher.group());
|
||||
}
|
||||
Matcher matcher = PATTERN.matcher(text);
|
||||
while (matcher.find()) {
|
||||
found.add(matcher.group());
|
||||
}
|
||||
|
||||
for (PlaceholderIntegration integration : REGISTERED_INTEGRATIONS) {
|
||||
@@ -337,6 +330,95 @@ public final class PlaceholderManager {
|
||||
return new ArrayList<>(found);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set placeholders without any integrations.
|
||||
* <p>
|
||||
* This is fallback if for some reason you don't have PAPI installed.
|
||||
* It's a cut-down version of the actual PAPI code, and I don't
|
||||
* really know how it works.
|
||||
* <p>
|
||||
* Original source
|
||||
* <a href="https://github.com/PlaceholderAPI/PlaceholderAPI/blob/master/src/main/java/me/clip/placeholderapi/replacer/CharsReplacer.java">here</a>.
|
||||
*
|
||||
* @param text The text.
|
||||
* @param player The player.
|
||||
* @return The text.
|
||||
*/
|
||||
private static String setWithoutIntegration(@NotNull final String text,
|
||||
@Nullable final Player player) {
|
||||
char[] chars = text.toCharArray();
|
||||
StringBuilder builder = new StringBuilder(text.length());
|
||||
StringBuilder identifier = new StringBuilder();
|
||||
StringBuilder parameters = new StringBuilder();
|
||||
|
||||
for (int i = 0; i < chars.length; i++) {
|
||||
char currentChar = chars[i];
|
||||
if (currentChar == '%' && i + 1 < chars.length) {
|
||||
boolean identified = false;
|
||||
boolean badPlaceholder = true;
|
||||
boolean hadSpace = false;
|
||||
|
||||
while (true) {
|
||||
i++;
|
||||
if (i >= chars.length) {
|
||||
break;
|
||||
}
|
||||
|
||||
char p = chars[i];
|
||||
if (p == ' ' && !identified) {
|
||||
hadSpace = true;
|
||||
break;
|
||||
}
|
||||
|
||||
if (p == '%') {
|
||||
badPlaceholder = false;
|
||||
break;
|
||||
}
|
||||
|
||||
if (p == '_' && !identified) {
|
||||
identified = true;
|
||||
} else if (identified) {
|
||||
parameters.append(p);
|
||||
} else {
|
||||
identifier.append(p);
|
||||
}
|
||||
}
|
||||
|
||||
String pluginName = identifier.toString().toLowerCase();
|
||||
EcoPlugin plugin = EcoPlugin.getPlugin(pluginName);
|
||||
String placeholderIdentifier = parameters.toString();
|
||||
identifier.setLength(0);
|
||||
parameters.setLength(0);
|
||||
if (badPlaceholder) {
|
||||
builder.append('%').append(pluginName);
|
||||
if (identified) {
|
||||
builder.append('_').append(placeholderIdentifier);
|
||||
}
|
||||
|
||||
if (hadSpace) {
|
||||
builder.append(' ');
|
||||
}
|
||||
} else {
|
||||
if (plugin == null) {
|
||||
builder.append('%').append(pluginName);
|
||||
|
||||
if (identified) {
|
||||
builder.append('_');
|
||||
}
|
||||
|
||||
builder.append(placeholderIdentifier).append('%');
|
||||
} else {
|
||||
builder.append(getResult(player, placeholderIdentifier, plugin));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
builder.append(currentChar);
|
||||
}
|
||||
}
|
||||
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private record PlaceholderLookup(@NotNull String identifier,
|
||||
@Nullable EcoPlugin plugin) {
|
||||
|
||||
|
||||
@@ -1,11 +0,0 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
/**
|
||||
* Wrapper class for shop integrations.
|
||||
*
|
||||
* @deprecated Use ShopIntegration instead.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
public interface ShopWrapper extends ShopIntegration {
|
||||
|
||||
}
|
||||
@@ -568,6 +568,42 @@ public final class Items {
|
||||
return EMPTY_TESTABLE_ITEM.matches(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if an item matches any items.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param items The items.
|
||||
* @return If matches any.
|
||||
*/
|
||||
public static boolean matchesAny(@Nullable final ItemStack itemStack,
|
||||
@NotNull final Collection<TestableItem> items) {
|
||||
for (TestableItem item : items) {
|
||||
if (item.matches(itemStack)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get if any item matches any item.
|
||||
*
|
||||
* @param itemStacks The items.
|
||||
* @param items The items.
|
||||
* @return If matches any.
|
||||
*/
|
||||
public static boolean matchesAny(@NotNull final Collection<ItemStack> itemStacks,
|
||||
@NotNull final Collection<TestableItem> items) {
|
||||
for (ItemStack itemStack : itemStacks) {
|
||||
if (matchesAny(itemStack, items)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private Items() {
|
||||
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
|
||||
}
|
||||
|
||||
168
eco-api/src/main/java/com/willfp/eco/core/map/DefaultMap.java
Normal file
168
eco-api/src/main/java/com/willfp/eco/core/map/DefaultMap.java
Normal file
@@ -0,0 +1,168 @@
|
||||
package com.willfp.eco.core.map;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collection;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.function.Supplier;
|
||||
|
||||
/**
|
||||
* A map with a default value.
|
||||
*
|
||||
* @param <K> The key type.
|
||||
* @param <V> The value type.
|
||||
*/
|
||||
public class DefaultMap<K, V> implements Map<K, V> {
|
||||
/**
|
||||
* The map.
|
||||
*/
|
||||
private final Map<K, V> map;
|
||||
|
||||
/**
|
||||
* The default value.
|
||||
*/
|
||||
private final Supplier<V> defaultValue;
|
||||
|
||||
/**
|
||||
* Create a new default map.
|
||||
*
|
||||
* @param defaultValue The default value.
|
||||
*/
|
||||
public DefaultMap(@NotNull final V defaultValue) {
|
||||
this(() -> defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new default map.
|
||||
*
|
||||
* @param defaultValue The default value.
|
||||
*/
|
||||
public DefaultMap(@NotNull final Supplier<V> defaultValue) {
|
||||
this(new HashMap<>(), defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new default map.
|
||||
*
|
||||
* @param map The map.
|
||||
* @param defaultValue The default value.
|
||||
*/
|
||||
public DefaultMap(@NotNull final Map<K, V> map,
|
||||
@NotNull final V defaultValue) {
|
||||
this(map, () -> defaultValue);
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new default map.
|
||||
*
|
||||
* @param map The map.
|
||||
* @param defaultValue The default value.
|
||||
*/
|
||||
public DefaultMap(@NotNull final Map<K, V> map,
|
||||
@NotNull final Supplier<V> defaultValue) {
|
||||
this.map = map;
|
||||
this.defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
@Override
|
||||
@NotNull
|
||||
@SuppressWarnings("unchecked")
|
||||
public V get(@Nullable final Object key) {
|
||||
if (key == null) {
|
||||
return defaultValue.get();
|
||||
}
|
||||
|
||||
if (map.get(key) == null) {
|
||||
map.put((K) key, defaultValue.get());
|
||||
}
|
||||
|
||||
return map.get(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int size() {
|
||||
return map.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isEmpty() {
|
||||
return map.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsKey(@Nullable final Object key) {
|
||||
return map.containsKey(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsValue(@Nullable final Object value) {
|
||||
return map.containsValue(value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public V put(@NotNull final K key, @Nullable final V value) {
|
||||
return map.put(key, value);
|
||||
}
|
||||
|
||||
@Override
|
||||
public V remove(@NotNull final Object key) {
|
||||
return map.remove(key);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void putAll(@NotNull final Map<? extends K, ? extends V> m) {
|
||||
map.putAll(m);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void clear() {
|
||||
map.clear();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<K> keySet() {
|
||||
return map.keySet();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Collection<V> values() {
|
||||
return map.values();
|
||||
}
|
||||
|
||||
@NotNull
|
||||
@Override
|
||||
public Set<Entry<K, V>> entrySet() {
|
||||
return map.entrySet();
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new nested map.
|
||||
*
|
||||
* @param <K> The key type.
|
||||
* @param <K1> The nested key type.
|
||||
* @param <V> The value type.
|
||||
* @return The nested map.
|
||||
*/
|
||||
@NotNull
|
||||
public static <K, K1, V> DefaultMap<K, Map<K1, V>> createNestedMap() {
|
||||
return new DefaultMap<>(new HashMap<>());
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new nested list map.
|
||||
*
|
||||
* @param <K> The key type.
|
||||
* @param <K1> The nested key type.
|
||||
* @param <V> The value type.
|
||||
* @return The nested list map.
|
||||
*/
|
||||
@NotNull
|
||||
public static <K, K1, V> DefaultMap<K, ListMap<K1, V>> createNestedListMap() {
|
||||
return new DefaultMap<>(new ListMap<>());
|
||||
}
|
||||
}
|
||||
32
eco-api/src/main/java/com/willfp/eco/core/map/ListMap.java
Normal file
32
eco-api/src/main/java/com/willfp/eco/core/map/ListMap.java
Normal file
@@ -0,0 +1,32 @@
|
||||
package com.willfp.eco.core.map;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Maps keys to lists of values.
|
||||
*
|
||||
* @param <K> The key type.
|
||||
* @param <V> The value type.
|
||||
*/
|
||||
public class ListMap<K, V> extends DefaultMap<K, List<V>> {
|
||||
/**
|
||||
* Create a new list map.
|
||||
*/
|
||||
public ListMap() {
|
||||
super(ArrayList::new);
|
||||
}
|
||||
|
||||
/**
|
||||
* Append a value to a key.
|
||||
*
|
||||
* @param key The key.
|
||||
* @param value The value.
|
||||
*/
|
||||
public void append(@NotNull final K key,
|
||||
@NotNull final V value) {
|
||||
this.get(key).add(value);
|
||||
}
|
||||
}
|
||||
21
eco-api/src/main/java/com/willfp/eco/core/packet/Packet.java
Normal file
21
eco-api/src/main/java/com/willfp/eco/core/packet/Packet.java
Normal file
@@ -0,0 +1,21 @@
|
||||
package com.willfp.eco.core.packet;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Represents a packet.
|
||||
*
|
||||
* @param handle The NMS handle.
|
||||
*/
|
||||
public record Packet(@NotNull Object handle) {
|
||||
/**
|
||||
* Send to a player.
|
||||
*
|
||||
* @param player The player.
|
||||
*/
|
||||
void send(@NotNull final Player player) {
|
||||
Eco.get().sendPacket(player, this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
package com.willfp.eco.core.packet;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.event.Cancellable;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Represents a packet being sent or received.
|
||||
*/
|
||||
public class PacketEvent implements Cancellable {
|
||||
/**
|
||||
* The packet.
|
||||
*/
|
||||
private final Packet packet;
|
||||
|
||||
/**
|
||||
* The player.
|
||||
*/
|
||||
private final Player player;
|
||||
|
||||
/**
|
||||
* If the event should be cancelled.
|
||||
*/
|
||||
private boolean cancelled = false;
|
||||
|
||||
/**
|
||||
* Create a new packet event.
|
||||
*
|
||||
* @param packet The packet.
|
||||
* @param player The player.
|
||||
*/
|
||||
public PacketEvent(@NotNull final Packet packet,
|
||||
@NotNull final Player player) {
|
||||
this.packet = packet;
|
||||
this.player = player;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the packet.
|
||||
*
|
||||
* @return The packet.
|
||||
*/
|
||||
@NotNull
|
||||
public Packet getPacket() {
|
||||
return packet;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the player.
|
||||
*
|
||||
* @return The player.
|
||||
*/
|
||||
@NotNull
|
||||
public Player getPlayer() {
|
||||
return player;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isCancelled() {
|
||||
return cancelled;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setCancelled(final boolean cancelled) {
|
||||
this.cancelled = cancelled;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.willfp.eco.core.packet;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Listens to packets.
|
||||
*/
|
||||
public interface PacketListener {
|
||||
/**
|
||||
* Called when a handle is sent.
|
||||
*
|
||||
* @param event The event.
|
||||
*/
|
||||
default void onSend(@NotNull final PacketEvent event) {
|
||||
// Override when needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Called when a handle is received.
|
||||
*
|
||||
* @param event The event.
|
||||
*/
|
||||
default void onReceive(@NotNull final PacketEvent event) {
|
||||
// Override when needed.
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the priority of the listener.
|
||||
*
|
||||
* @return The priority.
|
||||
*/
|
||||
default PacketPriority getPriority() {
|
||||
return PacketPriority.NORMAL;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
package com.willfp.eco.core.packet;
|
||||
|
||||
/**
|
||||
* The priority (order) of packet listeners.
|
||||
*/
|
||||
public enum PacketPriority {
|
||||
/**
|
||||
* Ran first.
|
||||
*/
|
||||
LOWEST,
|
||||
|
||||
/**
|
||||
* Ran second.
|
||||
*/
|
||||
LOW,
|
||||
|
||||
/**
|
||||
* Ran third.
|
||||
*/
|
||||
NORMAL,
|
||||
|
||||
/**
|
||||
* Ran fourth.
|
||||
*/
|
||||
HIGH,
|
||||
|
||||
/**
|
||||
* Ran last.
|
||||
*/
|
||||
HIGHEST
|
||||
}
|
||||
@@ -8,6 +8,13 @@ import org.jetbrains.annotations.NotNull;
|
||||
* Empty (invalid) particle that is spawned when an invalid key is provided.
|
||||
*/
|
||||
public final class EmptyParticle implements SpawnableParticle {
|
||||
/**
|
||||
* Instantiate a new empty particle.
|
||||
*/
|
||||
public EmptyParticle() {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void spawn(@NotNull final Location location,
|
||||
final int amount) {
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.placeholder;
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
@@ -16,7 +15,7 @@ public sealed interface Placeholder permits PlayerPlaceholder, PlayerlessPlaceho
|
||||
*
|
||||
* @return The plugin.
|
||||
*/
|
||||
@Nullable
|
||||
@NotNull
|
||||
EcoPlugin getPlugin();
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,7 +2,6 @@ package com.willfp.eco.core.placeholder;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
@@ -15,7 +14,7 @@ public interface PlaceholderInjectable {
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
default void injectPlaceholders(@NotNull StaticPlaceholder... placeholders) {
|
||||
this.injectPlaceholders(List.of(placeholders));
|
||||
this.addInjectablePlaceholder(List.of(placeholders));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -27,20 +26,6 @@ public interface PlaceholderInjectable {
|
||||
this.addInjectablePlaceholder(List.of(placeholders));
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject placeholder.
|
||||
*
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
default void injectPlaceholders(@NotNull Iterable<StaticPlaceholder> placeholders) {
|
||||
List<InjectablePlaceholder> toInject = new ArrayList<>();
|
||||
for (StaticPlaceholder placeholder : placeholders) {
|
||||
toInject.add(placeholder);
|
||||
}
|
||||
this.addInjectablePlaceholder(toInject);
|
||||
}
|
||||
|
||||
/**
|
||||
* Inject placeholders.
|
||||
* <p>
|
||||
@@ -48,41 +33,13 @@ public interface PlaceholderInjectable {
|
||||
*
|
||||
* @param placeholders The placeholders.
|
||||
*/
|
||||
default void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders) {
|
||||
List<StaticPlaceholder> toInject = new ArrayList<>();
|
||||
for (InjectablePlaceholder placeholder : placeholders) {
|
||||
if (placeholder instanceof StaticPlaceholder staticPlaceholder) {
|
||||
toInject.add(staticPlaceholder);
|
||||
}
|
||||
}
|
||||
this.injectPlaceholders(toInject);
|
||||
}
|
||||
void addInjectablePlaceholder(@NotNull Iterable<InjectablePlaceholder> placeholders);
|
||||
|
||||
/**
|
||||
* Clear injected placeholders.
|
||||
*/
|
||||
void clearInjectedPlaceholders();
|
||||
|
||||
/**
|
||||
* Get injected placeholders.
|
||||
*
|
||||
* @return Injected placeholders.
|
||||
* @deprecated Use getPlaceholderInjections.
|
||||
*/
|
||||
@Deprecated(since = "6.35.0", forRemoval = true)
|
||||
@NotNull
|
||||
default List<StaticPlaceholder> getInjectedPlaceholders() {
|
||||
List<StaticPlaceholder> found = new ArrayList<>();
|
||||
|
||||
for (InjectablePlaceholder placeholder : getPlaceholderInjections()) {
|
||||
if (placeholder instanceof StaticPlaceholder staticPlaceholder) {
|
||||
found.add(staticPlaceholder);
|
||||
}
|
||||
}
|
||||
|
||||
return found;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get injected placeholders.
|
||||
* <p>
|
||||
@@ -91,7 +48,5 @@ public interface PlaceholderInjectable {
|
||||
* @return Injected placeholders.
|
||||
*/
|
||||
@NotNull
|
||||
default List<InjectablePlaceholder> getPlaceholderInjections() {
|
||||
return new ArrayList<>(getInjectedPlaceholders());
|
||||
}
|
||||
List<InjectablePlaceholder> getPlaceholderInjections();
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
package com.willfp.eco.core.proxy;
|
||||
|
||||
/**
|
||||
* Prior to 6.17.0, all proxies were required to implement this interface,
|
||||
* however it produced no functionality and was not even used internally.
|
||||
*
|
||||
* @deprecated Unused class, not required. Will be removed in a subsequent release.
|
||||
*/
|
||||
@Deprecated(since = "6.17.0", forRemoval = true)
|
||||
public interface AbstractProxy {
|
||||
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
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.
|
||||
*
|
||||
* @deprecated No reason for this to be in the API.
|
||||
*/
|
||||
@Deprecated(since = "6.43.0", forRemoval = true)
|
||||
public interface Cleaner {
|
||||
/**
|
||||
* Clean up classes left over from plugin.
|
||||
*
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void clean(@NotNull EcoPlugin plugin);
|
||||
}
|
||||
@@ -22,7 +22,8 @@ public final class ProxyConstants {
|
||||
"v1_18_R1",
|
||||
"v1_18_R2",
|
||||
"v1_19_R1",
|
||||
"v1_19_R2"
|
||||
"v1_19_R2",
|
||||
"v1_19_R3"
|
||||
);
|
||||
|
||||
private ProxyConstants() {
|
||||
|
||||
@@ -16,15 +16,4 @@ public class ProxyError extends Error {
|
||||
@NotNull final Throwable cause) {
|
||||
super(message, cause);
|
||||
}
|
||||
|
||||
/**
|
||||
* Thrown if there is an error getting a proxy.
|
||||
*
|
||||
* @param message The message to send.
|
||||
* @deprecated Proxy Errors should include a cause.
|
||||
*/
|
||||
@Deprecated(forRemoval = true)
|
||||
public ProxyError(@NotNull final String message) {
|
||||
super(message);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,31 +0,0 @@
|
||||
package com.willfp.eco.core.proxy.exceptions;
|
||||
|
||||
import com.willfp.eco.core.proxy.ProxyConstants;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Error if the server is running an unsupported version.
|
||||
*
|
||||
* @deprecated Poorly named, exception when it's actually an error, contains doubly nested errors.
|
||||
*/
|
||||
@SuppressWarnings("removal")
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
public class UnsupportedVersionException extends ProxyError {
|
||||
/**
|
||||
* Thrown if the server is running an unsupported NMS version.
|
||||
*
|
||||
* @param message The message to send.
|
||||
* @deprecated Use the default constructor.
|
||||
*/
|
||||
@Deprecated(since = "6.24.0", forRemoval = true)
|
||||
public UnsupportedVersionException(@NotNull final String message) {
|
||||
super(message);
|
||||
}
|
||||
|
||||
/**
|
||||
* Thrown if the server is running an unsupported NMS version.
|
||||
*/
|
||||
public UnsupportedVersionException() {
|
||||
super("You're running an unsupported server version: " + ProxyConstants.NMS_VERSION, new IllegalStateException());
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,11 @@ public final class Recipes {
|
||||
* @return The match, or null if not found.
|
||||
*/
|
||||
@Nullable
|
||||
public static CraftingRecipe getMatch(@NotNull final ItemStack[] matrix) {
|
||||
public static CraftingRecipe getMatch(@Nullable final ItemStack[] matrix) {
|
||||
if (matrix == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return RECIPES_FROM_MATRIX.get(matrix).orElse(null);
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ public interface CraftingRecipe {
|
||||
* @param matrix The matrix to check.
|
||||
* @return If the recipe matches.
|
||||
*/
|
||||
boolean test(@NotNull ItemStack[] matrix);
|
||||
boolean test(@Nullable ItemStack[] matrix);
|
||||
|
||||
/**
|
||||
* Register the recipe.
|
||||
|
||||
@@ -69,7 +69,11 @@ public final class ShapedCraftingRecipe implements CraftingRecipe {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(@NotNull final ItemStack[] matrix) {
|
||||
public boolean test(@Nullable final ItemStack[] matrix) {
|
||||
if (matrix == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
List<ItemStack> dynamicMatrix = Arrays.asList(matrix);
|
||||
boolean matches = true;
|
||||
for (int i = 0; i < 9; i++) {
|
||||
|
||||
@@ -80,7 +80,11 @@ public final class ShapelessCraftingRecipe implements CraftingRecipe {
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean test(@NotNull final ItemStack[] matrix) {
|
||||
public boolean test(@Nullable final ItemStack[] matrix) {
|
||||
if (matrix == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
RecipeTest test = newTest();
|
||||
|
||||
for (ItemStack stack : matrix) {
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user