Compare commits

..

60 Commits

Author SHA1 Message Date
Auxilor
e725811c2f Merge branch 'develop' 2021-11-12 18:07:32 +00:00
Auxilor
f861820572 Fixed key registration 2021-11-12 17:58:43 +00:00
Auxilor
6e310a48c1 DurabilityUtils fix 2021-11-12 17:56:07 +00:00
Auxilor
505234ec13 More data changes 2021-11-12 17:32:50 +00:00
Auxilor
587aeb21a1 Overhauled persistent data storage 2021-11-12 15:55:25 +00:00
Auxilor
cc344bf7ca MySQL Threading changes 2021-11-12 14:12:15 +00:00
Auxilor
c912b97438 Changed PlayerProfileHandler 2021-11-12 11:10:56 +00:00
Auxilor
4788f036ee More data changes 2021-11-12 11:07:43 +00:00
Auxilor
f5ff484086 Revert "Updated dependency structure"
This reverts commit a3ba7cdcf2.
2021-11-12 10:28:17 +00:00
Auxilor
c031534b0d Debugging 2021-11-12 10:28:13 +00:00
Auxilor
62ac49db4b Merge remote-tracking branch 'origin/develop' into develop 2021-11-12 10:15:08 +00:00
Auxilor
32c416ef8e Fixed bugs 2021-11-11 13:09:09 +00:00
Auxilor
a1e22540d4 Improved async warning 2021-11-11 13:05:36 +00:00
Auxilor
1b66843992 Codestyle 2 2021-11-11 13:03:07 +00:00
Auxilor
55d316cb9d Codestyle 2021-11-11 12:59:22 +00:00
Auxilor
ac7a47a0f7 Merge remote-tracking branch 'origin/master' into develop 2021-11-11 12:45:06 +00:00
Will FP
70cd23d39a Merge pull request #51
Updated Lands integration a bit && Renamed async-display.enabled to async-display.always-enabled
2021-11-11 12:44:39 +00:00
Auxilor
44d39c4f5f Updated README 2021-11-11 12:36:45 +00:00
Auxilor
a3ba7cdcf2 Updated dependency structure 2021-11-10 19:14:09 +00:00
Auxilor
779323e280 Updated to 6.13.6 2021-11-10 19:06:11 +00:00
Auxilor
5c8a8ca3e4 Delombok 10/10 - Removed lombok dependency, cleaned up 2021-11-10 19:05:49 +00:00
Auxilor
4e4f792bcc Delombok 9/? - Delomboked EcoPlugin 2021-11-10 19:02:38 +00:00
_OfTeN_
48ae8ebe65 Updated Lands integration a bit
Renamed async-display.enabled to async-display.always-enabled
2021-11-10 22:00:47 +03:00
Auxilor
f8c65898d8 Delombok 8/? - Delomboked packets, PluginDependent, and Prerequisite 2021-11-10 18:57:44 +00:00
Auxilor
dbe514f97c Delombok 6/? - Delomboked items, GUIs, recipes, and tuples 2021-11-10 18:56:12 +00:00
Auxilor
b244be6dd6 Delombok 6/? - Delomboked events and extensions 2021-11-10 18:49:14 +00:00
Auxilor
4870f7f0d1 Delombok 5/? - Delomboked data 2021-11-10 18:44:56 +00:00
Auxilor
27888da33a Delombok 4/? - Delomboked config 2021-11-10 18:44:04 +00:00
Auxilor
33c132065d Delombok 3/? - Delomboked commands 2021-11-10 18:42:50 +00:00
Auxilor
ec09dbddf4 Delombok 2/? - Removed @UtilityClas 2021-11-10 18:39:30 +00:00
Auxilor
3811b01e81 Delomboked Utils 2021-11-10 18:31:38 +00:00
Auxilor
f883f8fe1d Updated to 6.13.5 2021-11-08 21:09:44 +00:00
Auxilor
80f43238e0 Fixed major fuckup 2021-11-08 21:09:33 +00:00
Auxilor
18e7548c23 Updated to 6.13.4 2021-11-08 14:05:32 +00:00
Auxilor
40020b0503 Added Extension#onAfterLoad and Extension#onReload 2021-11-08 14:04:24 +00:00
Auxilor
830f92bbdb Dropped Velocity and worked on bungee 2021-11-08 13:15:42 +00:00
Auxilor
c6e39e89fd Updated to 6.13.3 2021-11-08 10:58:26 +00:00
Auxilor
7d38d7db15 Saved player name changes 2021-11-08 10:58:18 +00:00
Auxilor
a6f139c47e Fixed plugin.yml 2021-11-05 14:40:56 +00:00
Auxilor
1bae159f94 Added velocity data listener 2021-11-05 14:30:43 +00:00
Auxilor
43d2835087 Prerequisite changes 2021-11-05 14:18:35 +00:00
Auxilor
cb2d4d6a34 Added ServerDisconnectEvent listener 2021-11-05 14:16:41 +00:00
Auxilor
9bb73d8e90 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	eco-core/core-plugin/src/main/kotlin/com/willfp/eco/spigot/data/storage/MySQLDataHandler.kt
2021-11-05 14:06:22 +00:00
Auxilor
86c4867206 Added BungeeDataListener and IridiumSkyblock support 2021-11-04 20:28:47 +00:00
Auxilor
43e13248d6 SQL changes (Please be done) and Antigrief changes 2021-11-04 20:15:26 +00:00
Auxilor
f6ff45228a Merge branch 'master' into develop 2021-11-04 20:02:29 +00:00
Will FP
af1c20f5c5 Merge pull request #49
Added DeluxeCombat integration
2021-11-04 20:01:59 +00:00
Auxilor
9ac564c345 Finally got exposed to shut up 2021-11-04 20:00:13 +00:00
Auxilor
857d51a7a1 Added PersistentDataKey#values 2021-11-04 19:16:38 +00:00
Auxilor
ab5f8cee5a Cleaned up DataHandler 2021-11-04 19:04:59 +00:00
Auxilor
bdd518b280 More Persistent Data changes 2021-11-04 19:00:47 +00:00
_OfTeN_
494c1a87b2 Added DeluxeCombat integration 2021-11-04 19:30:16 +03:00
Auxilor
f78f92b5f6 Fixed writing 2021-11-04 15:26:31 +00:00
Auxilor
048b56c58c Disabled Exposed logging 2021-11-04 14:06:09 +00:00
Auxilor
75dec2bf49 Re-added writeSafely to optionally specify predefined player ResultRow 2021-11-04 13:36:35 +00:00
Auxilor
7119da13b7 Bug Fixes 2021-11-04 13:32:23 +00:00
Auxilor
6a8637922b More SQL changes 2021-11-04 13:15:21 +00:00
Auxilor
abce7b898c Changed shutdown order 2021-11-04 13:02:23 +00:00
Auxilor
562d7f382c Updated to 6.13.2 2021-11-04 12:59:52 +00:00
Auxilor
c72b15c3a6 Several performance and stability improvements 2021-11-04 12:57:39 +00:00
87 changed files with 1500 additions and 677 deletions

View File

@@ -5,20 +5,17 @@
- The pull request must not have any checkstyle issues. - The pull request must not have any checkstyle issues.
- Every method and field must have a javadoc attached. - Every method and field must have a javadoc attached.
2. Use lombok wherever possible. 2. Use JetBrains annotations
- @Getter, @Setter, @UtilityClass only.
3. Use JetBrains annotations
- Every parameter should be annotated with @NotNull or @Nullable - Every parameter should be annotated with @NotNull or @Nullable
- Use @NotNull over lombok @NonNull - Use @NotNull over lombok @NonNull
4. Imports 3. Imports
- No group (*) imports. - No group (*) imports.
- No static imports. - No static imports.
## Dependency Injection ## Dependency Injection
- eco uses Dependency Injection - eco uses Dependency Injection
- Any calls to AbstractEcoPlugin#getInstance are code smells and should never be used unless **absolutely necessary**. - Any calls to Eco#getHandler#getEcoPlugin are code smells and should never be used unless **absolutely necessary**.
- NamespacedKeys, FixedMetadataValues, Runnables, and Schedules should be managed using AbstractEcoPlugin through DI. - NamespacedKeys, FixedMetadataValues, Runnables, and Schedules should be managed using AbstractEcoPlugin through DI.
- Any DI class should extend PluginDependent where possible. If the class extends another, then you **must** store the plugin instance in a private final variable called **plugin** with a private or protected getter. - Any DI class should extend PluginDependent where possible. If the class extends another, then you **must** store the plugin instance in a private final variable called **plugin** with a private or protected getter.

119
README.md
View File

@@ -1,22 +1,37 @@
<h1 align="center"> # eco
<br> eco is a powerful Spigot development library that simplifies the process of plugin creation and supercharges
<img src="https://i.imgur.com/kU3ejCt.png" alt="eco logo" width="256"> your plugins.
<br> It's the engine behind [EcoEnchants](https://polymart.org/resource/490), [Reforges](https://polymart.org/resource/1330),
</h1> [EcoItems](https://polymart.org/resource/1247), [EcoSkills](https://polymart.org/resource/1351),
[EcoArmor](https://polymart.org/resource/687), [Talismans](https://polymart.org/resource/611),
and many more.
<h4 align="center">eco - Simplify spigot development.</h4> <p>
<a href="https://github.com/Auxilor/eco/releases">
<img alt="spigot" src="https://img.shields.io/github/v/release/Auxilor/eco?color=informational"/>
</a>
<a href="https://bstats.org/plugin/bukkit/EcoEnchants" alt="bstats servers">
<img src="https://img.shields.io/bstats/servers/7666?color=informational"/>
</a>
<a href="https://bstats.org/plugin/bukkit/EcoEnchants" alt="bstats players">
<img src="https://img.shields.io/bstats/players/7666?color=informational"/>
</a>
<a href="https://plugins.auxilor.io/" alt="Docs (gitbook)">
<img src="https://img.shields.io/badge/docs-gitbook-informational"/>
</a>
<a href="https://discord.gg/ZcwpSsE/" alt="Discord">
<img src="https://img.shields.io/discord/452518336627081236?label=discord&color=informational"/>
</a>
</p>
### Plugin Information # For server owners
- Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/) - Requires ProtocolLib to be installed: get the latest version [here](https://www.spigotmc.org/resources/protocollib.1997/)
- Supports 1.16.5+ - Supports 1.16.5+
### bStats # For developers
<img src="https://bstats.org/signatures/bukkit/eco.svg" width="512">
# Information for development
## Javadoc ## Javadoc
The 6.8.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.8.0/javadoc/) The 6.13.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.13.0/javadoc/)
## Plugin Information ## Plugin Information
@@ -51,7 +66,7 @@ dependencies {
} }
``` ```
Replace `Tag` with a release tag for eco, eg `6.0.0`. Replace `Tag` with a release tag for eco, eg `6.13.0`.
Maven: Maven:
@@ -71,7 +86,7 @@ Maven:
</dependency> </dependency>
``` ```
Replace `Tag` with a release tag for eco, eg `6.8.0`. Replace `Tag` with a release tag for eco, eg `6.13.0`.
## Build locally: ## Build locally:
@@ -84,85 +99,21 @@ cd eco
./gradlew build ./gradlew build
``` ```
# Features
Here's a list of some (not all) of the features of eco:
- Command system with subcommands
- Reworked config system
- JSON Config Support
- Client-Side item display
- World drop system
- Event manager
- PlayerJumpEvent
- ArmorEquipEvent
- EntityDeathByEntityEvent
- NaturalExpGainEvent
- Plugin extensions (com.willfp.eco.internal.Plugins for plugins)
- GUI System
- Integration system for external plugins
- Anticheat support
- AAC
- Matrix
- NCP
- Spartan
- Vulcan
- Antigrief/Combat support
- CombatLogX (V10 + V11)
- FactionsUUID
- GriefPrevention
- Kingdoms
- Lands
- Towny
- WorldGuard
- mcMMO support
- Custom Items support
- Oraxen
- PlaceholderAPI support
- NMS Proxy / Wrapper system built in
- Custom Items system
- Crafting Recipe handler
- Tuples
- Support uploading to / downloading from hastebin
- Packet System (via ProtocolLib)
- Dependency Injection systems
- Prerequisite system
- API additions (via utility classes)
- Get bow from arrow
- Break a block as a player
- Get a vein of blocks
- Create 2D lists
- Create NamespacedKeys safely
- Random number, distribution, roman numerals
- Set skull texture
- Format all strings
- Hex Support
- Gradient Support
- Placeholder Support
- Get a scoreboard team from any color
- Telekinesis (Drops straight to inventory) system
- More vector options
- Update checker
- bStats integration
- Reworked systems for:
- NamespacedKey
- MetadataValue
- Runnables / Scheduling
... and a lot more!
## License ## License
*Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).* *Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
<h1 align="center"> <h1 align="center">
Check out our partners!
<br>
<div style="width: 50%; margin: 0 auto;">
<br> <br>
<a href="https://gamersupps.gg/discount/Auxilor?afmc=Auxilor" target="_blank"> <a href="https://gamersupps.gg/discount/Auxilor?afmc=Auxilor" target="_blank">
<img src="https://i.imgur.com/uFDpBAC.png" alt="supps banner"> <img src="https://i.imgur.com/7mFhlQO.png" alt="supps banner">
</a> </a>
<a href="https://dedimc.promo/Auxilor" target="_blank"> <a href="https://dedimc.promo/Auxilor" target="_blank">
<img src="https://i.imgur.com/zdDLhFA.png" alt="dedimc banner"> <img src="https://i.imgur.com/x9aeH38.png" alt="dedimc banner">
</a> </a>
<br> <br>
</div>
</h1> </h1>

View File

@@ -34,7 +34,7 @@ allprojects {
// bStats, mcMMO, BentoBox // bStats, mcMMO, BentoBox
maven { url 'https://repo.codemc.org/repository/maven-public/' } maven { url 'https://repo.codemc.org/repository/maven-public/' }
// Spigot API // Spigot API, Bungee API
maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' } maven { url 'https://hub.spigotmc.org/nexus/content/repositories/snapshots/' }
// PlaceholderAPI // PlaceholderAPI
@@ -54,17 +54,14 @@ allprojects {
// CombatLogX // CombatLogX
maven { url 'https://nexus.sirblobman.xyz/repository/public/' } maven { url 'https://nexus.sirblobman.xyz/repository/public/' }
// IridiumSkyblock
maven { url 'https://nexus.iridiumdevelopment.net/repository/maven-releases/' }
} }
dependencies { dependencies {
compileOnly 'org.jetbrains:annotations:19.0.0' compileOnly 'org.jetbrains:annotations:19.0.0'
// Lombok
compileOnly 'org.projectlombok:lombok:1.18.22'
annotationProcessor 'org.projectlombok:lombok:1.18.20'
testCompileOnly 'org.projectlombok:lombok:1.18.20'
testAnnotationProcessor 'org.projectlombok:lombok:1.18.20'
// Test // Test
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1' testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1' testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'

View File

@@ -6,7 +6,6 @@ import com.comphenix.protocol.events.ListenerPriority;
import com.comphenix.protocol.events.PacketAdapter; import com.comphenix.protocol.events.PacketAdapter;
import com.comphenix.protocol.events.PacketContainer; import com.comphenix.protocol.events.PacketContainer;
import com.comphenix.protocol.events.PacketEvent; import com.comphenix.protocol.events.PacketEvent;
import lombok.Getter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -26,7 +25,6 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
* <p> * <p>
* Useful for monitor priority adapters that <b>must</b> be ran last. * Useful for monitor priority adapters that <b>must</b> be ran last.
*/ */
@Getter
private final boolean postLoad; private final boolean postLoad;
/** /**
@@ -134,4 +132,13 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
ProtocolLibrary.getProtocolManager().addPacketListener(this); ProtocolLibrary.getProtocolManager().addPacketListener(this);
} }
} }
/**
* Get if the packet adapter should be loaded last.
*
* @return If post load.
*/
public boolean isPostLoad() {
return this.postLoad;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core; package com.willfp.eco.core;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import org.jetbrains.annotations.NotNull;
* *
* @see Handler * @see Handler
*/ */
@UtilityClass public final class Eco {
public class Eco {
/** /**
* Instance of eco handler. * Instance of eco handler.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
private Handler handler; private static Handler handler;
/** /**
* Set the handler. * Set the handler.
* @param handler The handler. * @param handler The handler.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public void setHandler(@NotNull final Handler handler) { public static void setHandler(@NotNull final Handler handler) {
Validate.isTrue(Eco.handler == null, "Already initialized!"); Validate.isTrue(Eco.handler == null, "Already initialized!");
Eco.handler = handler; Eco.handler = handler;
@@ -46,7 +44,11 @@ public class Eco {
* @return The handler. * @return The handler.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public Handler getHandler() { public static Handler getHandler() {
return handler; return handler;
} }
private Eco() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -7,6 +7,7 @@ import com.willfp.eco.core.config.updating.ConfigHandler;
import com.willfp.eco.core.display.Display; import com.willfp.eco.core.display.Display;
import com.willfp.eco.core.display.DisplayModule; import com.willfp.eco.core.display.DisplayModule;
import com.willfp.eco.core.events.EventManager; import com.willfp.eco.core.events.EventManager;
import com.willfp.eco.core.extensions.Extension;
import com.willfp.eco.core.extensions.ExtensionLoader; import com.willfp.eco.core.extensions.ExtensionLoader;
import com.willfp.eco.core.factory.MetadataValueFactory; import com.willfp.eco.core.factory.MetadataValueFactory;
import com.willfp.eco.core.factory.NamespacedKeyFactory; import com.willfp.eco.core.factory.NamespacedKeyFactory;
@@ -17,7 +18,6 @@ import com.willfp.eco.core.proxy.AbstractProxy;
import com.willfp.eco.core.proxy.ProxyFactory; import com.willfp.eco.core.proxy.ProxyFactory;
import com.willfp.eco.core.scheduling.Scheduler; import com.willfp.eco.core.scheduling.Scheduler;
import com.willfp.eco.core.web.UpdateChecker; import com.willfp.eco.core.web.UpdateChecker;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion; import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@@ -56,73 +56,61 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
/** /**
* The polymart resource ID of the plugin. * The polymart resource ID of the plugin.
*/ */
@Getter
private final int resourceId; private final int resourceId;
/** /**
* The bStats resource ID of the plugin. * The bStats resource ID of the plugin.
*/ */
@Getter
private final int bStatsId; private final int bStatsId;
/** /**
* The package where proxy implementations are. * The package where proxy implementations are.
*/ */
@Getter
private final String proxyPackage; private final String proxyPackage;
/** /**
* The color of the plugin, used in messages. * The color of the plugin, used in messages.
*/ */
@Getter
private final String color; private final String color;
/** /**
* Loaded integrations. * Loaded integrations.
*/ */
@Getter
private final Set<String> loadedIntegrations = new HashSet<>(); private final Set<String> loadedIntegrations = new HashSet<>();
/** /**
* The internal plugin scheduler. * The internal plugin scheduler.
*/ */
@Getter
private final Scheduler scheduler; private final Scheduler scheduler;
/** /**
* The internal plugin Event Manager. * The internal plugin Event Manager.
*/ */
@Getter
private final EventManager eventManager; private final EventManager eventManager;
/** /**
* Config.yml. * Config.yml.
*/ */
@Getter
private final ConfigYml configYml; private final ConfigYml configYml;
/** /**
* Lang.yml. * Lang.yml.
*/ */
@Getter
private final LangYml langYml; private final LangYml langYml;
/** /**
* The internal factory to produce {@link org.bukkit.NamespacedKey}s. * The internal factory to produce {@link org.bukkit.NamespacedKey}s.
*/ */
@Getter
private final NamespacedKeyFactory namespacedKeyFactory; private final NamespacedKeyFactory namespacedKeyFactory;
/** /**
* The internal factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s. * The internal factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s.
*/ */
@Getter
private final MetadataValueFactory metadataValueFactory; private final MetadataValueFactory metadataValueFactory;
/** /**
* The internal factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s. * The internal factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s.
*/ */
@Getter
private final RunnableFactory runnableFactory; private final RunnableFactory runnableFactory;
/** /**
@@ -130,19 +118,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
* *
* @see com.willfp.eco.core.extensions.Extension * @see com.willfp.eco.core.extensions.Extension
*/ */
@Getter
private final ExtensionLoader extensionLoader; private final ExtensionLoader extensionLoader;
/** /**
* The handler class for updatable classes. * The handler class for updatable classes.
*/ */
@Getter
private final ConfigHandler configHandler; private final ConfigHandler configHandler;
/** /**
* The display module for the plugin. * The display module for the plugin.
*/ */
@Getter
private DisplayModule displayModule; private DisplayModule displayModule;
/** /**
@@ -153,19 +138,17 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
/** /**
* If the server is running an outdated version of the plugin. * If the server is running an outdated version of the plugin.
*/ */
@Getter
private boolean outdated = false; private boolean outdated = false;
/** /**
* If the plugin supports extensions. * If the plugin supports extensions.
*/ */
@Getter
private final boolean supportingExtensions; private final boolean supportingExtensions;
/** /**
* The proxy factory. * The proxy factory.
*/ */
@Getter @Nullable
private final ProxyFactory proxyFactory; private final ProxyFactory proxyFactory;
/** /**
@@ -469,6 +452,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
this.reload(); this.reload();
for (Extension extension : this.getExtensionLoader().getLoadedExtensions()) {
extension.handleAfterLoad();
}
this.getLogger().info("Loaded " + this.color + this.getName()); this.getLogger().info("Loaded " + this.color + this.getName());
} }
@@ -483,6 +470,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
this.getScheduler().cancelAll(); this.getScheduler().cancelAll();
this.handleReload(); this.handleReload();
for (Extension extension : this.extensionLoader.getLoadedExtensions()) {
extension.handleReload();
}
} }
/** /**
@@ -724,4 +715,168 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
public static Set<String> getPluginNames() { public static Set<String> getPluginNames() {
return new HashSet<>(Eco.getHandler().getLoadedPlugins()); return new HashSet<>(Eco.getHandler().getLoadedPlugins());
} }
/**
* Get the polymart resource ID.
*
* @return The resource ID.
*/
public int getResourceId() {
return this.resourceId;
}
/**
* Get the bStats ID.
*
* @return The ID.
*/
public int getBStatsId() {
return this.bStatsId;
}
/**
* Get the proxy package.
*
* @return The package where proxies are contained.
*/
public String getProxyPackage() {
return this.proxyPackage;
}
/**
* Get the plugin color (uses legacy formatting).
*
* @return The color.
*/
public String getColor() {
return this.color;
}
/**
* Get all loaded integration names.
*
* @return The integrations.
*/
public Set<String> getLoadedIntegrations() {
return this.loadedIntegrations;
}
/**
* Get the scheduler.
*
* @return The scheduler.
*/
public Scheduler getScheduler() {
return this.scheduler;
}
/**
* Get the event manager.
*
* @return The event manager.
*/
public EventManager getEventManager() {
return this.eventManager;
}
/**
* Get config.yml.
*
* @return config.yml.
*/
public ConfigYml getConfigYml() {
return this.configYml;
}
/**
* Get lang.yml.
*
* @return lang.yml.
*/
public LangYml getLangYml() {
return this.langYml;
}
/**
* Get the NamespacedKey factory.
*
* @return The factory.
*/
public NamespacedKeyFactory getNamespacedKeyFactory() {
return this.namespacedKeyFactory;
}
/**
* Get the metadata value factory.
*
* @return The factory.
*/
public MetadataValueFactory getMetadataValueFactory() {
return this.metadataValueFactory;
}
/**
* Get the runnable factory.
*
* @return The runnable factory.
*/
public RunnableFactory getRunnableFactory() {
return this.runnableFactory;
}
/**
* Get the extension loader.
*
* @return The extension loader.
*/
public ExtensionLoader getExtensionLoader() {
return this.extensionLoader;
}
/**
* Get the config handler.
*
* @return The config handler.
*/
public ConfigHandler getConfigHandler() {
return this.configHandler;
}
/**
* Get the plugin's display module.
*
* @return The display module.
*/
@Nullable
public DisplayModule getDisplayModule() {
return this.displayModule;
}
/**
* Get if the plugin is outdated.
*
* @return If outdated.
*/
public boolean isOutdated() {
return this.outdated;
}
/**
* Get if the plugin supports extensions.
*
* @return If extensions are supported.
*/
public boolean isSupportingExtensions() {
return this.supportingExtensions;
}
/**
* Get the proxy factory.
*
* @return The proxy factory.
*/
@Nullable
public ProxyFactory getProxyFactory() {
return this.proxyFactory;
}
} }

View File

@@ -1,7 +1,5 @@
package com.willfp.eco.core; package com.willfp.eco.core;
import lombok.AccessLevel;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@@ -13,7 +11,6 @@ public abstract class PluginDependent<T extends EcoPlugin> {
/** /**
* The {@link EcoPlugin} that is stored. * The {@link EcoPlugin} that is stored.
*/ */
@Getter(AccessLevel.PROTECTED)
@NotNull @NotNull
private final T plugin; private final T plugin;
@@ -25,4 +22,14 @@ public abstract class PluginDependent<T extends EcoPlugin> {
protected PluginDependent(@NotNull final T plugin) { protected PluginDependent(@NotNull final T plugin) {
this.plugin = plugin; this.plugin = plugin;
} }
/**
* Get the plugin.
*
* @return The plugin.
*/
@NotNull
protected T getPlugin() {
return this.plugin;
}
} }

View File

@@ -1,8 +1,8 @@
package com.willfp.eco.core; package com.willfp.eco.core;
import com.willfp.eco.core.integrations.economy.EconomyManager;
import com.willfp.eco.core.proxy.ProxyConstants; import com.willfp.eco.core.proxy.ProxyConstants;
import com.willfp.eco.util.ClassUtils; import com.willfp.eco.util.ClassUtils;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList; import java.util.ArrayList;
@@ -31,8 +31,11 @@ public class Prerequisite {
); );
/** /**
* Requires the server to be running an implementation of paper. * Requires the server to have vault installed.
*
* @deprecated Use {@link EconomyManager#hasRegistrations()} instead.
*/ */
@Deprecated
public static final Prerequisite HAS_VAULT = new Prerequisite( public static final Prerequisite HAS_VAULT = new Prerequisite(
() -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"), () -> ClassUtils.exists("net.milkbowl.vault.economy.Economy"),
"Requires server to have vault" "Requires server to have vault"
@@ -46,10 +49,25 @@ public class Prerequisite {
"Requires server to be running 1.17+" "Requires server to be running 1.17+"
); );
/**
* Requires the server to be running an implementation of BungeeCord.
*/
public static final Prerequisite HAS_BUNGEECORD = new Prerequisite(
() -> ClassUtils.exists("net.md_5.bungee.api.event.ServerConnectedEvent"),
"Requires server to be running BungeeCord (or a fork)"
);
/**
* Requires the server to be running an implementation of Velocity.
*/
public static final Prerequisite HAS_VELOCITY = new Prerequisite(
() -> ClassUtils.exists("com.velocitypowered.api.event.player.ServerConnectedEvent"),
"Requires server to be running Velocity (or a fork)"
);
/** /**
* If the necessary prerequisite condition has been met. * If the necessary prerequisite condition has been met.
*/ */
@Getter
private boolean isMet; private boolean isMet;
/** /**
@@ -60,7 +78,6 @@ public class Prerequisite {
/** /**
* The description of the requirements of the prerequisite. * The description of the requirements of the prerequisite.
*/ */
@Getter
private final String description; private final String description;
/** /**
@@ -105,4 +122,22 @@ public class Prerequisite {
static { static {
update(); update();
} }
/**
* Get if the prerequisite is met.
*
* @return If the condition is met.
*/
public boolean isMet() {
return this.isMet;
}
/**
* Get the description.
*
* @return The description.
*/
public String getDescription() {
return this.description;
}
} }

View File

@@ -5,9 +5,6 @@ import com.willfp.eco.core.PluginDependent;
import com.willfp.eco.core.command.CommandBase; import com.willfp.eco.core.command.CommandBase;
import com.willfp.eco.core.command.CommandHandler; import com.willfp.eco.core.command.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler; import com.willfp.eco.core.command.TabCompleteHandler;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil; import org.bukkit.util.StringUtil;
@@ -30,7 +27,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
/** /**
* The name of the command. * The name of the command.
*/ */
@Getter
private final String name; private final String name;
/** /**
@@ -38,7 +34,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
* <p> * <p>
* Written out as a string for flexibility with subclasses. * Written out as a string for flexibility with subclasses.
*/ */
@Getter
private final String permission; private final String permission;
/** /**
@@ -46,27 +41,23 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
* <p> * <p>
* In other worlds, only allowed to be executed by console. * In other worlds, only allowed to be executed by console.
*/ */
@Getter
private final boolean playersOnly; private final boolean playersOnly;
/** /**
* The actual code to be executed in the command. * The actual code to be executed in the command.
*/ */
@Getter private CommandHandler handler = (sender, args) -> {
@Setter // Do nothing by default
private CommandHandler handler = (sender, args) -> { }; };
/** /**
* The tab completion code to be executed in the command. * The tab completion code to be executed in the command.
*/ */
@Getter
@Setter
private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>(); private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>();
/** /**
* All subcommands for the command. * All subcommands for the command.
*/ */
@Getter(AccessLevel.PROTECTED)
private final List<CommandBase> subcommands; private final List<CommandBase> subcommands;
/** /**
@@ -202,4 +193,76 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
return true; return true;
} }
/**
* Get the command name.
*
* @return The name.
*/
public String getName() {
return this.name;
}
/**
* Get the permission required to execute the command.
*
* @return The permission.
*/
public String getPermission() {
return this.permission;
}
/**
* Get if the command can only be executed by players.
*
* @return If players only.
*/
public boolean isPlayersOnly() {
return this.playersOnly;
}
/**
* Get the actual code to be executed in the command.
*
* @return The code.
*/
public CommandHandler getHandler() {
return this.handler;
}
/**
* Get the tab completion code to be executed in the command.
*
* @return The code.
*/
public TabCompleteHandler getTabCompleter() {
return this.tabCompleter;
}
/**
* Get the subcommands of the command.
*
* @return The subcommands.
*/
public List<CommandBase> getSubcommands() {
return this.subcommands;
}
/**
* Set the command handler.
*
* @param handler The handler.
*/
public void setHandler(@NotNull final CommandHandler handler) {
this.handler = handler;
}
/**
* Set the tab completer.
*
* @param tabCompleter The tab completer.
*/
public void setTabCompleter(@NotNull final TabCompleteHandler tabCompleter) {
this.tabCompleter = tabCompleter;
}
} }

View File

@@ -2,7 +2,6 @@ package com.willfp.eco.core.config.wrapper;
import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -27,7 +26,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
* <p> * <p>
* In general use, though, the handle isn't necessary. * In general use, though, the handle isn't necessary.
*/ */
@Getter
private final T handle; private final T handle;
/** /**
@@ -179,4 +177,13 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
public Config clone() { public Config clone() {
return handle.clone(); return handle.clone();
} }
/**
* Get the handle.
*
* @return The handle.
*/
public T getHandle() {
return this.handle;
}
} }

View File

@@ -19,7 +19,6 @@ public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements
super(handle); super(handle);
} }
@Override @Override
public YamlConfiguration getBukkitHandle() { public YamlConfiguration getBukkitHandle() {
return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle(); return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle();

View File

@@ -1,7 +1,9 @@
package com.willfp.eco.core.data; package com.willfp.eco.core.data;
import com.willfp.eco.core.data.keys.PersistentDataKey;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
/** /**
@@ -17,16 +19,60 @@ public interface PlayerProfileHandler {
PlayerProfile load(@NotNull UUID uuid); PlayerProfile load(@NotNull UUID uuid);
/** /**
* Save a player profile. * Unload a player profile from memory.
* <p>
* This will not save the profile first.
* *
* @param uuid The uuid. * @param uuid The uuid.
*/ */
void savePlayer(@NotNull UUID uuid); void unloadPlayer(@NotNull UUID uuid);
/**
* Save a player profile.
* <p>
* Can run async if using MySQL.
*
* @param uuid The uuid.
* @deprecated Saving changes is faster and should be used. Saving a player manually is not recommended.
*/
@Deprecated
default void savePlayer(@NotNull UUID uuid) {
this.saveKeysForPlayer(uuid, PersistentDataKey.values());
}
/**
* Save keys for a player.
* <p>
* Can run async if using MySQL.
*
* @param uuid The uuid.
* @param keys The keys.
*/
void saveKeysForPlayer(@NotNull UUID uuid,
@NotNull Set<PersistentDataKey<?>> keys);
/** /**
* Save all player data. * Save all player data.
* *
* @param async If the saving should be done asynchronously. * @param async If the saving should be done asynchronously.
* @deprecated async is now handled automatically depending on implementation.
*/ */
void saveAll(boolean async); @Deprecated
default void saveAll(boolean async) {
saveAll();
}
/**
* Save all player data.
* <p>
* Can run async if using MySQL.
*/
void saveAll();
/**
* Commit all changes to the file.
* <p>
* Does nothing if using MySQL.
*/
void save();
} }

View File

@@ -1,10 +1,11 @@
package com.willfp.eco.core.data.keys; package com.willfp.eco.core.data.keys;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Set;
/** /**
* A persistent data key is a key with a type that can be stored about an offline player. * A persistent data key is a key with a type that can be stored about an offline player.
* *
@@ -14,19 +15,16 @@ public class PersistentDataKey<T> {
/** /**
* The key of the persistent data value. * The key of the persistent data value.
*/ */
@Getter
private final NamespacedKey key; private final NamespacedKey key;
/** /**
* The default value for the key. * The default value for the key.
*/ */
@Getter
private final T defaultValue; private final T defaultValue;
/** /**
* The persistent data key type. * The persistent data key type.
*/ */
@Getter
private final PersistentDataKeyType type; private final PersistentDataKeyType type;
/** /**
@@ -54,4 +52,40 @@ public class PersistentDataKey<T> {
+ ", type=" + type + ", type=" + type
+ '}'; + '}';
} }
/**
* Get all persistent data keys.
*
* @return The keys.
*/
public static Set<PersistentDataKey<?>> values() {
return Eco.getHandler().getKeyRegistry().getRegisteredKeys();
}
/**
* Get the key.
*
* @return The key.
*/
public NamespacedKey getKey() {
return this.key;
}
/**
* Get the default value.
*
* @return The default value.
*/
public T getDefaultValue() {
return this.defaultValue;
}
/**
* Get the data key type.
*
* @return The key type.
*/
public PersistentDataKeyType getType() {
return this.type;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.display; package com.willfp.eco.core.display;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@@ -10,8 +9,7 @@ import org.jetbrains.annotations.Nullable;
/** /**
* Utility class to manage client-side item display. * Utility class to manage client-side item display.
*/ */
@UtilityClass public final class Display {
public class Display {
/** /**
* The prefix for client-side lore lines. * The prefix for client-side lore lines.
*/ */
@@ -28,7 +26,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack display(@NotNull final ItemStack itemStack) { public static ItemStack display(@NotNull final ItemStack itemStack) {
return display(itemStack, null); return display(itemStack, null);
} }
@@ -39,8 +37,8 @@ public class Display {
* @param player The player. * @param player The player.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack display(@NotNull final ItemStack itemStack, public static ItemStack display(@NotNull final ItemStack itemStack,
@Nullable final Player player) { @Nullable final Player player) {
return handler.display(itemStack, player); return handler.display(itemStack, player);
} }
@@ -50,7 +48,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) { public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
return finalize(display(itemStack, null)); return finalize(display(itemStack, null));
} }
@@ -61,7 +59,7 @@ public class Display {
* @param player The player. * @param player The player.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack, public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
@Nullable final Player player) { @Nullable final Player player) {
return finalize(display(itemStack, player)); return finalize(display(itemStack, player));
} }
@@ -72,7 +70,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack revert(@NotNull final ItemStack itemStack) { public static ItemStack revert(@NotNull final ItemStack itemStack) {
return handler.revert(itemStack); return handler.revert(itemStack);
} }
@@ -82,7 +80,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack finalize(@NotNull final ItemStack itemStack) { public static ItemStack finalize(@NotNull final ItemStack itemStack) {
return handler.finalize(itemStack); return handler.finalize(itemStack);
} }
@@ -92,7 +90,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return The ItemStack. * @return The ItemStack.
*/ */
public ItemStack unfinalize(@NotNull final ItemStack itemStack) { public static ItemStack unfinalize(@NotNull final ItemStack itemStack) {
return handler.unfinalize(itemStack); return handler.unfinalize(itemStack);
} }
@@ -102,7 +100,7 @@ public class Display {
* @param itemStack The item. * @param itemStack The item.
* @return If finalized. * @return If finalized.
*/ */
public boolean isFinalized(@NotNull final ItemStack itemStack) { public static boolean isFinalized(@NotNull final ItemStack itemStack) {
return handler.isFinalized(itemStack); return handler.isFinalized(itemStack);
} }
@@ -111,7 +109,7 @@ public class Display {
* *
* @param module The module. * @param module The module.
*/ */
public void registerDisplayModule(@NotNull final DisplayModule module) { public static void registerDisplayModule(@NotNull final DisplayModule module) {
handler.registerDisplayModule(module); handler.registerDisplayModule(module);
} }
@@ -176,4 +174,8 @@ public class Display {
Display.handler = handler; Display.handler = handler;
} }
private Display() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -2,7 +2,6 @@ package com.willfp.eco.core.display;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginDependent; import com.willfp.eco.core.PluginDependent;
import lombok.Getter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -15,7 +14,6 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
/** /**
* The priority of the module. * The priority of the module.
*/ */
@Getter
private final DisplayPriority priority; private final DisplayPriority priority;
/** /**
@@ -81,4 +79,13 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
public final String getPluginName() { public final String getPluginName() {
return super.getPlugin().getName(); return super.getPlugin().getName();
} }
/**
* Get the display priority.
*
* @return The priority.
*/
public DisplayPriority getPriority() {
return this.priority;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.events; package com.willfp.eco.core.events;
import lombok.Getter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent; import org.bukkit.event.player.PlayerEvent;
@@ -23,13 +22,11 @@ public class ArmorChangeEvent extends PlayerEvent {
/** /**
* The armor contents before. 0 is helmet, 3 is boots. * The armor contents before. 0 is helmet, 3 is boots.
*/ */
@Getter
private final List<ItemStack> before; private final List<ItemStack> before;
/** /**
* The armor contents after. 0 is helmet, 3 is boots. * The armor contents after. 0 is helmet, 3 is boots.
*/ */
@Getter
private final List<ItemStack> after; private final List<ItemStack> after;
/** /**
@@ -37,7 +34,7 @@ public class ArmorChangeEvent extends PlayerEvent {
* *
* @param player The player. * @param player The player.
* @param before The armor contents before. * @param before The armor contents before.
* @param after The armor contents after. * @param after The armor contents after.
*/ */
public ArmorChangeEvent(@NotNull final Player player, public ArmorChangeEvent(@NotNull final Player player,
@NotNull final List<ItemStack> before, @NotNull final List<ItemStack> before,
@@ -52,7 +49,6 @@ public class ArmorChangeEvent extends PlayerEvent {
* *
* @return A list of handlers handling this event. * @return A list of handlers handling this event.
*/ */
@Override @Override
@NotNull @NotNull
public HandlerList getHandlers() { public HandlerList getHandlers() {
@@ -67,4 +63,22 @@ public class ArmorChangeEvent extends PlayerEvent {
public static HandlerList getHandlerList() { public static HandlerList getHandlerList() {
return HANDLERS; return HANDLERS;
} }
/**
* Get the contents before the change.
*
* @return The contents.
*/
public List<ItemStack> getBefore() {
return this.before;
}
/**
* Get the current contents.
*
* @return The contents.
*/
public List<ItemStack> getAfter() {
return this.after;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.events; package com.willfp.eco.core.events;
import lombok.Getter;
import org.bukkit.entity.Entity; import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event; import org.bukkit.event.Event;
@@ -25,31 +24,26 @@ public class EntityDeathByEntityEvent extends Event {
/** /**
* The {@link LivingEntity} killed. * The {@link LivingEntity} killed.
*/ */
@Getter
private final LivingEntity victim; private final LivingEntity victim;
/** /**
* The {@link Entity} that killed. * The {@link Entity} that killed.
*/ */
@Getter
private final Entity killer; private final Entity killer;
/** /**
* The associated {@link EntityDeathEvent}. * The associated {@link EntityDeathEvent}.
*/ */
@Getter
private final EntityDeathEvent deathEvent; private final EntityDeathEvent deathEvent;
/** /**
* The entity drops. * The entity drops.
*/ */
@Getter
private final List<ItemStack> drops; private final List<ItemStack> drops;
/** /**
* The xp to drop. * The xp to drop.
*/ */
@Getter
private final int xp; private final int xp;
/** /**
@@ -91,4 +85,49 @@ public class EntityDeathByEntityEvent extends Event {
public static HandlerList getHandlerList() { public static HandlerList getHandlerList() {
return HANDLERS; return HANDLERS;
} }
/**
* Get the entity killed.
*
* @return The victim.
*/
public LivingEntity getVictim() {
return this.victim;
}
/**
* Get the killer.
*
* @return The killer.
*/
public Entity getKiller() {
return this.killer;
}
/**
* Get the death event that caused this event.
*
* @return The death event.
*/
public EntityDeathEvent getDeathEvent() {
return this.deathEvent;
}
/**
* Get the drops.
*
* @return The drops.
*/
public List<ItemStack> getDrops() {
return this.drops;
}
/**
* Get the experience dropped.
*
* @return The experience.
*/
public int getXp() {
return this.xp;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.events; package com.willfp.eco.core.events;
import lombok.Getter;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.HandlerList; import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerExpChangeEvent; import org.bukkit.event.player.PlayerExpChangeEvent;
@@ -20,7 +19,6 @@ public class NaturalExpGainEvent extends Event {
* The associated {@link PlayerExpChangeEvent}. * The associated {@link PlayerExpChangeEvent}.
* Use this to modify event parameters. * Use this to modify event parameters.
*/ */
@Getter
private final PlayerExpChangeEvent expChangeEvent; private final PlayerExpChangeEvent expChangeEvent;
/** /**
@@ -50,4 +48,13 @@ public class NaturalExpGainEvent extends Event {
public static HandlerList getHandlerList() { public static HandlerList getHandlerList() {
return HANDLERS; return HANDLERS;
} }
/**
* Get the event that caused this event.
*
* @return The exp change event.
*/
public PlayerExpChangeEvent getExpChangeEvent() {
return this.expChangeEvent;
}
} }

View File

@@ -3,8 +3,6 @@ package com.willfp.eco.core.extensions;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.updating.ConfigHandler; import com.willfp.eco.core.config.updating.ConfigHandler;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -25,7 +23,6 @@ public abstract class Extension implements PluginLike {
/** /**
* The {@link EcoPlugin} that this extension is for. * The {@link EcoPlugin} that this extension is for.
*/ */
@Getter(AccessLevel.PROTECTED)
private final EcoPlugin plugin; private final EcoPlugin plugin;
/** /**
@@ -57,6 +54,20 @@ public abstract class Extension implements PluginLike {
this.onDisable(); this.onDisable();
} }
/**
* Method to handle after load.
*/
public final void handleAfterLoad() {
this.onAfterLoad();
}
/**
* Method to handle plugin reloads.
*/
public final void handleReload() {
this.onReload();
}
/** /**
* Called on enabling Extension. * Called on enabling Extension.
*/ */
@@ -67,6 +78,20 @@ public abstract class Extension implements PluginLike {
*/ */
protected abstract void onDisable(); protected abstract void onDisable();
/**
* Called the once the base plugin is done loading.
*/
protected void onAfterLoad() {
// Override if needed
}
/**
* Called on plugin reload.
*/
protected void onReload() {
// Override if needed
}
/** /**
* Set the metadata of the extension. * Set the metadata of the extension.
* <p> * <p>
@@ -117,4 +142,13 @@ public abstract class Extension implements PluginLike {
public ConfigHandler getConfigHandler() { public ConfigHandler getConfigHandler() {
return this.plugin.getConfigHandler(); return this.plugin.getConfigHandler();
} }
/**
* Get the plugin for the extension.
*
* @return The plugin.
*/
protected EcoPlugin getPlugin() {
return this.plugin;
}
} }

View File

@@ -2,7 +2,6 @@ package com.willfp.eco.core.gui.slot;
import com.willfp.eco.core.items.builder.ItemStackBuilder; import com.willfp.eco.core.items.builder.ItemStackBuilder;
import com.willfp.eco.util.ListUtils; import com.willfp.eco.util.ListUtils;
import lombok.Getter;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -29,7 +28,6 @@ public class FillerMask {
/** /**
* Mask. * Mask.
*/ */
@Getter
private final List<List<Slot>> mask; private final List<List<Slot>> mask;
/** /**
@@ -47,7 +45,7 @@ public class FillerMask {
* Create a new filler mask. * Create a new filler mask.
* *
* @param materials The mask materials. * @param materials The mask materials.
* @param pattern The pattern. * @param pattern The pattern.
*/ */
public FillerMask(@NotNull final MaskMaterials materials, public FillerMask(@NotNull final MaskMaterials materials,
@NotNull final String... pattern) { @NotNull final String... pattern) {
@@ -82,4 +80,13 @@ public class FillerMask {
} }
} }
} }
/**
* Get the mask.
*
* @return The mask.
*/
public List<List<Slot>> getMask() {
return this.mask;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.gui.slot; package com.willfp.eco.core.gui.slot;
import lombok.Getter;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,7 +13,6 @@ public class FillerSlot implements Slot {
/** /**
* The ItemStack. * The ItemStack.
*/ */
@Getter
private final ItemStack itemStack; private final ItemStack itemStack;
/** /**
@@ -35,4 +33,13 @@ public class FillerSlot implements Slot {
public boolean isCaptive() { public boolean isCaptive() {
return false; return false;
} }
/**
* Get the ItemStack.
*
* @return The ItemStack.
*/
public ItemStack getItemStack() {
return this.itemStack;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations; package com.willfp.eco.core.integrations;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
@@ -17,7 +16,6 @@ public class IntegrationLoader {
/** /**
* The plugin to require to load the integration. * The plugin to require to load the integration.
*/ */
@Getter
private final String pluginName; private final String pluginName;
/** /**
@@ -38,4 +36,13 @@ public class IntegrationLoader {
public void load() { public void load() {
runnable.run(); runnable.run();
} }
/**
* Get the plugin name.
*
* @return The plugin name.
*/
public String getPluginName() {
return this.pluginName;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.afk; package com.willfp.eco.core.integrations.afk;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import java.util.Set;
/** /**
* Class to handle afk integrations. * Class to handle afk integrations.
*/ */
@UtilityClass public final class AFKManager {
public class AFKManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<AFKWrapper> registered = new HashSet<>(); private static final Set<AFKWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final AFKWrapper integration) { public static void register(@NotNull final AFKWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
@@ -32,8 +30,8 @@ public class AFKManager {
* @param player The player. * @param player The player.
* @return If afk. * @return If afk.
*/ */
public boolean isAfk(@NotNull final Player player) { public static boolean isAfk(@NotNull final Player player) {
for (AFKWrapper afkWrapper : registered) { for (AFKWrapper afkWrapper : REGISTERED) {
if (afkWrapper.isAfk(player)) { if (afkWrapper.isAfk(player)) {
return true; return true;
} }
@@ -41,4 +39,8 @@ public class AFKManager {
return false; return false;
} }
private AFKManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.integrations.anticheat; package com.willfp.eco.core.integrations.anticheat;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -12,12 +11,11 @@ import java.util.Set;
/** /**
* Class to handle anticheat integrations. * Class to handle anticheat integrations.
*/ */
@UtilityClass public final class AnticheatManager {
public class AnticheatManager {
/** /**
* A set of all registered anticheats. * A set of all registered anticheats.
*/ */
private final Set<AnticheatWrapper> anticheats = new HashSet<>(); private static final Set<AnticheatWrapper> ANTICHEATS = new HashSet<>();
/** /**
* Register a new anticheat. * Register a new anticheat.
@@ -25,12 +23,12 @@ public class AnticheatManager {
* @param plugin The plugin. * @param plugin The plugin.
* @param anticheat The anticheat to register. * @param anticheat The anticheat to register.
*/ */
public void register(@NotNull final EcoPlugin plugin, public static void register(@NotNull final EcoPlugin plugin,
@NotNull final AnticheatWrapper anticheat) { @NotNull final AnticheatWrapper anticheat) {
if (anticheat instanceof Listener) { if (anticheat instanceof Listener) {
plugin.getEventManager().registerListener((Listener) anticheat); plugin.getEventManager().registerListener((Listener) anticheat);
} }
anticheats.add(anticheat); ANTICHEATS.add(anticheat);
} }
/** /**
@@ -38,8 +36,8 @@ public class AnticheatManager {
* *
* @param player The player to exempt. * @param player The player to exempt.
*/ */
public void exemptPlayer(@NotNull final Player player) { public static void exemptPlayer(@NotNull final Player player) {
anticheats.forEach(anticheat -> anticheat.exempt(player)); ANTICHEATS.forEach(anticheat -> anticheat.exempt(player));
} }
/** /**
@@ -48,7 +46,11 @@ public class AnticheatManager {
* *
* @param player The player to remove the exemption. * @param player The player to remove the exemption.
*/ */
public void unexemptPlayer(@NotNull final Player player) { public static void unexemptPlayer(@NotNull final Player player) {
anticheats.forEach(anticheat -> anticheat.unexempt(player)); ANTICHEATS.forEach(anticheat -> anticheat.unexempt(player));
}
private AnticheatManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.antigrief; package com.willfp.eco.core.integrations.antigrief;
import lombok.experimental.UtilityClass;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
@@ -13,20 +12,19 @@ import java.util.Set;
/** /**
* Class to handle antigrief integrations. * Class to handle antigrief integrations.
*/ */
@UtilityClass public final class AntigriefManager {
public class AntigriefManager {
/** /**
* Registered antigriefs. * Registered antigriefs.
*/ */
private final Set<AntigriefWrapper> registered = new HashSet<>(); private static final Set<AntigriefWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new AntiGrief/Land Management integration. * Register a new AntiGrief/Land Management integration.
* *
* @param antigrief The integration to register. * @param antigrief The integration to register.
*/ */
public void register(@NotNull final AntigriefWrapper antigrief) { public static void register(@NotNull final AntigriefWrapper antigrief) {
registered.add(antigrief); REGISTERED.add(antigrief);
} }
/** /**
@@ -34,9 +32,9 @@ public class AntigriefManager {
* *
* @param antigrief The integration to unregister. * @param antigrief The integration to unregister.
*/ */
public void unregister(@NotNull final AntigriefWrapper antigrief) { public static void unregister(@NotNull final AntigriefWrapper antigrief) {
registered.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName())); REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
registered.remove(antigrief); REGISTERED.remove(antigrief);
} }
/** /**
@@ -46,9 +44,9 @@ public class AntigriefManager {
* @param block The block. * @param block The block.
* @return If player can break block. * @return If player can break block.
*/ */
public boolean canBreakBlock(@NotNull final Player player, public static boolean canBreakBlock(@NotNull final Player player,
@NotNull final Block block) { @NotNull final Block block) {
return registered.stream().allMatch(antigriefWrapper -> antigriefWrapper.canBreakBlock(player, block)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canBreakBlock(player, block));
} }
/** /**
@@ -58,9 +56,9 @@ public class AntigriefManager {
* @param location The location. * @param location The location.
* @return If player can create explosion. * @return If player can create explosion.
*/ */
public boolean canCreateExplosion(@NotNull final Player player, public static boolean canCreateExplosion(@NotNull final Player player,
@NotNull final Location location) { @NotNull final Location location) {
return registered.stream().allMatch(antigriefWrapper -> antigriefWrapper.canCreateExplosion(player, location)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canCreateExplosion(player, location));
} }
/** /**
@@ -70,9 +68,9 @@ public class AntigriefManager {
* @param block The block. * @param block The block.
* @return If player can place block. * @return If player can place block.
*/ */
public boolean canPlaceBlock(@NotNull final Player player, public static boolean canPlaceBlock(@NotNull final Player player,
@NotNull final Block block) { @NotNull final Block block) {
return registered.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPlaceBlock(player, block)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPlaceBlock(player, block));
} }
/** /**
@@ -82,8 +80,12 @@ public class AntigriefManager {
* @param victim The victim. * @param victim The victim.
* @return If player can injure. * @return If player can injure.
*/ */
public boolean canInjure(@NotNull final Player player, public static boolean canInjure(@NotNull final Player player,
@NotNull final LivingEntity victim) { @NotNull final LivingEntity victim) {
return registered.stream().allMatch(antigriefWrapper -> antigriefWrapper.canInjure(player, victim)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canInjure(player, victim));
}
private AntigriefManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }
} }

View File

@@ -15,7 +15,7 @@ public interface AntigriefWrapper extends Integration {
* *
* @param player The player. * @param player The player.
* @param block The block. * @param block The block.
* @return If player cna break block. * @return If player can break block.
*/ */
boolean canBreakBlock(Player player, Block block); boolean canBreakBlock(Player player, Block block);

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.customitems; package com.willfp.eco.core.integrations.customitems;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashSet; import java.util.HashSet;
@@ -9,20 +8,19 @@ import java.util.Set;
/** /**
* Class to handle custom item integrations. * Class to handle custom item integrations.
*/ */
@UtilityClass public final class CustomItemsManager {
public class CustomItemsManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<CustomItemsWrapper> registered = new HashSet<>(); private static final Set<CustomItemsWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final CustomItemsWrapper integration) { public static void register(@NotNull final CustomItemsWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
@@ -30,9 +28,13 @@ public class CustomItemsManager {
* *
* @see com.willfp.eco.core.items.Items * @see com.willfp.eco.core.items.Items
*/ */
public void registerAllItems() { public static void registerAllItems() {
for (CustomItemsWrapper customItemsWrapper : registered) { for (CustomItemsWrapper customItemsWrapper : REGISTERED) {
customItemsWrapper.registerAllItems(); customItemsWrapper.registerAllItems();
} }
} }
private CustomItemsManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.economy; package com.willfp.eco.core.integrations.economy;
import lombok.experimental.UtilityClass;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import java.util.Set;
/** /**
* Class to handle economy. * Class to handle economy.
*/ */
@UtilityClass public final class EconomyManager {
public class EconomyManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<EconomyWrapper> registered = new HashSet<>(); private static final Set<EconomyWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final EconomyWrapper integration) { public static void register(@NotNull final EconomyWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
@@ -31,8 +29,8 @@ public class EconomyManager {
* *
* @return If any economy. * @return If any economy.
*/ */
public boolean hasRegistrations() { public static boolean hasRegistrations() {
return !registered.isEmpty(); return !REGISTERED.isEmpty();
} }
/** /**
@@ -42,9 +40,9 @@ public class EconomyManager {
* @param amount The amount. * @param amount The amount.
* @return If the player has the amount. * @return If the player has the amount.
*/ */
public boolean hasAmount(@NotNull final OfflinePlayer player, public static boolean hasAmount(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : registered) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.hasAmount(player, amount); return wrapper.hasAmount(player, amount);
} }
@@ -58,9 +56,9 @@ public class EconomyManager {
* @param amount The amount to give. * @param amount The amount to give.
* @return If the transaction was a success. * @return If the transaction was a success.
*/ */
public boolean giveMoney(@NotNull final OfflinePlayer player, public static boolean giveMoney(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : registered) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.giveMoney(player, amount); return wrapper.giveMoney(player, amount);
} }
@@ -74,9 +72,9 @@ public class EconomyManager {
* @param amount The amount to remove. * @param amount The amount to remove.
* @return If the transaction was a success. * @return If the transaction was a success.
*/ */
public boolean removeMoney(@NotNull final OfflinePlayer player, public static boolean removeMoney(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : registered) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.removeMoney(player, amount); return wrapper.removeMoney(player, amount);
} }
@@ -89,11 +87,15 @@ public class EconomyManager {
* @param player The player. * @param player The player.
* @return The balance. * @return The balance.
*/ */
public double getBalance(@NotNull final OfflinePlayer player) { public static double getBalance(@NotNull final OfflinePlayer player) {
for (EconomyWrapper wrapper : registered) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.getBalance(player); return wrapper.getBalance(player);
} }
return 0; return 0;
} }
private EconomyManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.hologram; package com.willfp.eco.core.integrations.hologram;
import lombok.experimental.UtilityClass;
import org.bukkit.Location; import org.bukkit.Location;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -11,20 +10,19 @@ import java.util.Set;
/** /**
* Class to handle hologram integrations. * Class to handle hologram integrations.
*/ */
@UtilityClass public final class HologramManager {
public class HologramManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<HologramWrapper> registered = new HashSet<>(); private static final Set<HologramWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final HologramWrapper integration) { public static void register(@NotNull final HologramWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
@@ -34,12 +32,16 @@ public class HologramManager {
* @param contents The contents for the hologram. * @param contents The contents for the hologram.
* @return The hologram. * @return The hologram.
*/ */
public Hologram createHologram(@NotNull final Location location, public static Hologram createHologram(@NotNull final Location location,
@NotNull final List<String> contents) { @NotNull final List<String> contents) {
for (HologramWrapper wrapper : registered) { for (HologramWrapper wrapper : REGISTERED) {
return wrapper.createHologram(location, contents); return wrapper.createHologram(location, contents);
} }
return new DummyHologram(); return new DummyHologram();
} }
private HologramManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.mcmmo; package com.willfp.eco.core.integrations.mcmmo;
import lombok.experimental.UtilityClass;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -11,20 +10,19 @@ import java.util.Set;
/** /**
* Class to handle mcmmo integrations. * Class to handle mcmmo integrations.
*/ */
@UtilityClass public final class McmmoManager {
public class McmmoManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<McmmoWrapper> registered = new HashSet<>(); private static final Set<McmmoWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final McmmoWrapper integration) { public static void register(@NotNull final McmmoWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
@@ -33,8 +31,8 @@ public class McmmoManager {
* @param block The block. * @param block The block.
* @return The bonus drop count. * @return The bonus drop count.
*/ */
public int getBonusDropCount(@NotNull final Block block) { public static int getBonusDropCount(@NotNull final Block block) {
for (McmmoWrapper mcmmoWrapper : registered) { for (McmmoWrapper mcmmoWrapper : REGISTERED) {
return mcmmoWrapper.getBonusDropCount(block); return mcmmoWrapper.getBonusDropCount(block);
} }
return 0; return 0;
@@ -46,10 +44,14 @@ public class McmmoManager {
* @param event The event to check. * @param event The event to check.
* @return If the event is fake. * @return If the event is fake.
*/ */
public boolean isFake(@NotNull final Event event) { public static boolean isFake(@NotNull final Event event) {
for (McmmoWrapper mcmmoWrapper : registered) { for (McmmoWrapper mcmmoWrapper : REGISTERED) {
return mcmmoWrapper.isFake(event); return mcmmoWrapper.isFake(event);
} }
return false; return false;
} }
private McmmoManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.placeholder; package com.willfp.eco.core.integrations.placeholder;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -17,7 +16,6 @@ public class PlaceholderEntry {
/** /**
* The name of the placeholder, used in lookups. * The name of the placeholder, used in lookups.
*/ */
@Getter
private final String identifier; private final String identifier;
/** /**
@@ -78,6 +76,15 @@ public class PlaceholderEntry {
return requiresPlayer; return requiresPlayer;
} }
/**
* Get the identifier.
*
* @return The identifier.
*/
public String getIdentifier() {
return identifier;
}
/** /**
* Register the placeholder. * Register the placeholder.
*/ */

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.placeholder; package com.willfp.eco.core.integrations.placeholder;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -13,8 +12,7 @@ import java.util.Set;
/** /**
* Class to handle placeholder integrations. * Class to handle placeholder integrations.
*/ */
@UtilityClass public final class PlaceholderManager {
public class PlaceholderManager {
/** /**
* All registered placeholders. * All registered placeholders.
*/ */
@@ -81,4 +79,8 @@ public class PlaceholderManager {
} }
return processed; return processed;
} }
private PlaceholderManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.shop; package com.willfp.eco.core.integrations.shop;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashSet; import java.util.HashSet;
@@ -9,28 +8,31 @@ import java.util.Set;
/** /**
* Class to handle shop integrations. * Class to handle shop integrations.
*/ */
@UtilityClass public final class ShopManager {
public class ShopManager {
/** /**
* A set of all registered integrations. * A set of all registered integrations.
*/ */
private final Set<ShopWrapper> registered = new HashSet<>(); private static final Set<ShopWrapper> REGISTERED = new HashSet<>();
/** /**
* Register a new integration. * Register a new integration.
* *
* @param integration The integration to register. * @param integration The integration to register.
*/ */
public void register(@NotNull final ShopWrapper integration) { public static void register(@NotNull final ShopWrapper integration) {
registered.add(integration); REGISTERED.add(integration);
} }
/** /**
* Register eco item provider for shop plugins. * Register eco item provider for shop plugins.
*/ */
public void registerEcoProvider() { public static void registerEcoProvider() {
for (ShopWrapper shopWrapper : registered) { for (ShopWrapper shopWrapper : REGISTERED) {
shopWrapper.registerEcoProvider(); shopWrapper.registerEcoProvider();
} }
} }
private ShopManager() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.items; package com.willfp.eco.core.items;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -23,7 +22,6 @@ public class CustomItem implements TestableItem {
/** /**
* The key. * The key.
*/ */
@Getter
private final NamespacedKey key; private final NamespacedKey key;
/** /**
@@ -77,4 +75,13 @@ public class CustomItem implements TestableItem {
public void register() { public void register() {
Items.registerCustomItem(this.getKey(), this); Items.registerCustomItem(this.getKey(), this);
} }
/**
* Get the key.
*
* @return The key.
*/
public NamespacedKey getKey() {
return this.key;
}
} }

View File

@@ -8,7 +8,6 @@ import com.willfp.eco.core.recipe.parts.ModifiedTestableItem;
import com.willfp.eco.core.recipe.parts.TestableStack; import com.willfp.eco.core.recipe.parts.TestableStack;
import com.willfp.eco.util.NamespacedKeyUtils; import com.willfp.eco.util.NamespacedKeyUtils;
import com.willfp.eco.util.NumberUtils; import com.willfp.eco.util.NumberUtils;
import lombok.experimental.UtilityClass;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -28,7 +27,6 @@ import java.util.stream.Collectors;
/** /**
* Class to manage all custom and vanilla items. * Class to manage all custom and vanilla items.
*/ */
@UtilityClass
public final class Items { public final class Items {
/** /**
* All recipe parts. * All recipe parts.
@@ -51,7 +49,7 @@ public final class Items {
* @param key The key of the item. * @param key The key of the item.
* @param item The item. * @param item The item.
*/ */
public void registerCustomItem(@NotNull final NamespacedKey key, public static void registerCustomItem(@NotNull final NamespacedKey key,
@NotNull final TestableItem item) { @NotNull final TestableItem item) {
REGISTRY.put(key, item); REGISTRY.put(key, item);
} }
@@ -61,7 +59,7 @@ public final class Items {
* *
* @param provider The provider. * @param provider The provider.
*/ */
public void registerItemProvider(@NotNull final ItemProvider provider) { public static void registerItemProvider(@NotNull final ItemProvider provider) {
PROVIDERS.put(provider.getNamespace(), provider); PROVIDERS.put(provider.getNamespace(), provider);
} }
@@ -70,7 +68,7 @@ public final class Items {
* *
* @param parser The parser. * @param parser The parser.
*/ */
public void registerArgParser(@NotNull final LookupArgParser parser) { public static void registerArgParser(@NotNull final LookupArgParser parser) {
ARG_PARSERS.add(parser); ARG_PARSERS.add(parser);
} }
@@ -79,7 +77,7 @@ public final class Items {
* *
* @param key The key of the recipe part. * @param key The key of the recipe part.
*/ */
public void removeCustomItem(@NotNull final NamespacedKey key) { public static void removeCustomItem(@NotNull final NamespacedKey key) {
REGISTRY.remove(key); REGISTRY.remove(key);
} }
@@ -106,7 +104,7 @@ public final class Items {
* @param key The lookup string. * @param key The lookup string.
* @return The testable item, or an {@link EmptyTestableItem}. * @return The testable item, or an {@link EmptyTestableItem}.
*/ */
public TestableItem lookup(@NotNull final String key) { public static TestableItem lookup(@NotNull final String key) {
if (key.contains("?")) { if (key.contains("?")) {
String[] options = key.split("\\?"); String[] options = key.split("\\?");
for (String option : options) { for (String option : options) {
@@ -243,7 +241,7 @@ public final class Items {
* @param itemStack The itemStack to check. * @param itemStack The itemStack to check.
* @return If is recipe. * @return If is recipe.
*/ */
public boolean isCustomItem(@NotNull final ItemStack itemStack) { public static boolean isCustomItem(@NotNull final ItemStack itemStack) {
for (TestableItem item : REGISTRY.values()) { for (TestableItem item : REGISTRY.values()) {
if (item.matches(itemStack)) { if (item.matches(itemStack)) {
return true; return true;
@@ -259,7 +257,7 @@ public final class Items {
* @return The custom item, or null if not exists. * @return The custom item, or null if not exists.
*/ */
@Nullable @Nullable
public CustomItem getCustomItem(@NotNull final ItemStack itemStack) { public static CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
for (TestableItem item : REGISTRY.values()) { for (TestableItem item : REGISTRY.values()) {
if (item.matches(itemStack)) { if (item.matches(itemStack)) {
return getOrWrap(item); return getOrWrap(item);
@@ -273,7 +271,7 @@ public final class Items {
* *
* @return A set of all items. * @return A set of all items.
*/ */
public Set<CustomItem> getCustomItems() { public static Set<CustomItem> getCustomItems() {
return REGISTRY.values().stream().map(Items::getOrWrap).collect(Collectors.toSet()); return REGISTRY.values().stream().map(Items::getOrWrap).collect(Collectors.toSet());
} }
@@ -286,7 +284,7 @@ public final class Items {
* @param item The item. * @param item The item.
* @return The CustomItem. * @return The CustomItem.
*/ */
public CustomItem getOrWrap(@NotNull final TestableItem item) { public static CustomItem getOrWrap(@NotNull final TestableItem item) {
if (item instanceof CustomItem) { if (item instanceof CustomItem) {
return (CustomItem) item; return (CustomItem) item;
} else { } else {
@@ -297,4 +295,8 @@ public final class Items {
); );
} }
} }
private Items() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,8 +1,6 @@
package com.willfp.eco.core.items.builder; package com.willfp.eco.core.items.builder;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
@@ -29,13 +27,11 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
/** /**
* The ItemMeta used while building. * The ItemMeta used while building.
*/ */
@Getter(AccessLevel.PROTECTED)
private final T meta; private final T meta;
/** /**
* The ItemStack. * The ItemStack.
*/ */
@Getter(AccessLevel.PROTECTED)
private final ItemStack base; private final ItemStack base;
/** /**
@@ -73,6 +69,11 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
@Override @Override
public U addEnchantment(@NotNull final Enchantment enchantment, public U addEnchantment(@NotNull final Enchantment enchantment,
final int level) { final int level) {
//noinspection ConstantConditions
if (enchantment == null) {
return (U) this;
}
meta.addEnchant(enchantment, level, true); meta.addEnchant(enchantment, level, true);
return (U) this; return (U) this;
} }
@@ -196,4 +197,22 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
return base; return base;
} }
/**
* Get the base ItemStack.
*
* @return The base ItemStack.
*/
protected ItemStack getBase() {
return base;
}
/**
* Get the meta.
*
* @return The meta.
*/
protected T getMeta() {
return meta;
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.items.provider; package com.willfp.eco.core.items.provider;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -17,7 +16,6 @@ public abstract class ItemProvider {
/** /**
* The namespace. * The namespace.
*/ */
@Getter
private final String namespace; private final String namespace;
/** /**
@@ -37,4 +35,13 @@ public abstract class ItemProvider {
*/ */
@Nullable @Nullable
public abstract TestableItem provideForKey(@NotNull String key); public abstract TestableItem provideForKey(@NotNull String key);
/**
* Get the namespace.
*
* @return The namespace.
*/
public String getNamespace() {
return this.namespace;
}
} }

View File

@@ -1,15 +1,17 @@
package com.willfp.eco.core.proxy; package com.willfp.eco.core.proxy;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
/** /**
* Proxy / NMS constants. * Proxy / NMS constants.
*/ */
@UtilityClass public final class ProxyConstants {
public class ProxyConstants {
/** /**
* The NMS version that the server is running on. * The NMS version that the server is running on.
*/ */
public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3]; public static final String NMS_VERSION = Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3];
private ProxyConstants() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -6,7 +6,6 @@ import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.items.Items; import com.willfp.eco.core.items.Items;
import com.willfp.eco.core.recipe.recipes.CraftingRecipe; import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe; import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
import lombok.experimental.UtilityClass;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -17,9 +16,8 @@ import java.util.List;
/** /**
* Utility class to manage and register crafting recipes. * Utility class to manage and register crafting recipes.
*/ */
@UtilityClass
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
public class Recipes { public final class Recipes {
/** /**
* Registry of all recipes. * Registry of all recipes.
*/ */
@@ -31,7 +29,7 @@ public class Recipes {
* *
* @param recipe The recipe. * @param recipe The recipe.
*/ */
public void register(@NotNull final CraftingRecipe recipe) { public static void register(@NotNull final CraftingRecipe recipe) {
RECIPES.forcePut(recipe.getKey(), recipe); RECIPES.forcePut(recipe.getKey(), recipe);
} }
@@ -42,7 +40,7 @@ public class Recipes {
* @return The match, or null if not found. * @return The match, or null if not found.
*/ */
@Nullable @Nullable
public CraftingRecipe getMatch(@NotNull final ItemStack[] matrix) { public static CraftingRecipe getMatch(@NotNull final ItemStack[] matrix) {
return RECIPES.values().stream().filter(recipe -> recipe.test(matrix)).findFirst().orElse(null); return RECIPES.values().stream().filter(recipe -> recipe.test(matrix)).findFirst().orElse(null);
} }
@@ -53,7 +51,7 @@ public class Recipes {
* @return The recipe, or null if not found. * @return The recipe, or null if not found.
*/ */
@Nullable @Nullable
public CraftingRecipe getRecipe(@NotNull final NamespacedKey key) { public static CraftingRecipe getRecipe(@NotNull final NamespacedKey key) {
CraftingRecipe recipe = RECIPES.get(key); CraftingRecipe recipe = RECIPES.get(key);
if (recipe != null) { if (recipe != null) {
return recipe; return recipe;
@@ -77,10 +75,10 @@ public class Recipes {
* @param recipeStrings The recipe. * @param recipeStrings The recipe.
* @return The recipe. * @return The recipe.
*/ */
public CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin, public static CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin,
@NotNull final String key, @NotNull final String key,
@NotNull final ItemStack output, @NotNull final ItemStack output,
@NotNull final List<String> recipeStrings) { @NotNull final List<String> recipeStrings) {
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key).setOutput(output); ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key).setOutput(output);
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
@@ -92,4 +90,8 @@ public class Recipes {
return recipe; return recipe;
} }
private Recipes() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.recipe.parts; package com.willfp.eco.core.recipe.parts;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -15,7 +14,6 @@ public class MaterialTestableItem implements TestableItem {
/** /**
* The material. * The material.
*/ */
@Getter
private final Material material; private final Material material;
/** /**
@@ -44,4 +42,13 @@ public class MaterialTestableItem implements TestableItem {
public ItemStack getItem() { public ItemStack getItem() {
return new ItemStack(material); return new ItemStack(material);
} }
/**
* Get the material.
*
* @return The material.
*/
public Material getMaterial() {
return this.material;
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.recipe.parts; package com.willfp.eco.core.recipe.parts;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -17,13 +16,11 @@ public class ModifiedTestableItem implements TestableItem {
/** /**
* The item. * The item.
*/ */
@Getter
private final TestableItem handle; private final TestableItem handle;
/** /**
* The amount. * The amount.
*/ */
@Getter
private final Predicate<ItemStack> test; private final Predicate<ItemStack> test;
/** /**
@@ -61,4 +58,22 @@ public class ModifiedTestableItem implements TestableItem {
public ItemStack getItem() { public ItemStack getItem() {
return example; return example;
} }
/**
* Get the handle.
*
* @return The handle.
*/
public TestableItem getHandle() {
return this.handle;
}
/**
* Get the test.
*
* @return The test.
*/
public Predicate<ItemStack> getTest() {
return this.test;
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.recipe.parts; package com.willfp.eco.core.recipe.parts;
import com.willfp.eco.core.items.TestableItem; import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,13 +13,11 @@ public class TestableStack implements TestableItem {
/** /**
* The item. * The item.
*/ */
@Getter
private final TestableItem handle; private final TestableItem handle;
/** /**
* The amount. * The amount.
*/ */
@Getter
private final int amount; private final int amount;
/** /**
@@ -55,4 +52,22 @@ public class TestableStack implements TestableItem {
temp.setAmount(amount); temp.setAmount(amount);
return temp; return temp;
} }
/**
* Get the handle.
*
* @return The handle.
*/
public TestableItem getHandle() {
return this.handle;
}
/**
* Get the amount in the stack.
*
* @return The amount.
*/
public int getAmount() {
return this.amount;
}
} }

View File

@@ -1,7 +1,5 @@
package com.willfp.eco.core.recipe.recipes; package com.willfp.eco.core.recipe.recipes;
import lombok.Getter;
/** /**
* Positions in a 3x3 crafting recipe. * Positions in a 3x3 crafting recipe.
*/ */
@@ -54,7 +52,6 @@ public enum RecipePosition {
/** /**
* The index within a crafting table matrix. * The index within a crafting table matrix.
*/ */
@Getter
private final int index; private final int index;
/** /**
@@ -65,4 +62,13 @@ public enum RecipePosition {
RecipePosition(final int index) { RecipePosition(final int index) {
this.index = index; this.index = index;
} }
/**
* Get the index within a crafting table matrix.
*
* @return The index.
*/
public int getIndex() {
return index;
}
} }

View File

@@ -7,7 +7,6 @@ import com.willfp.eco.core.items.TestableItem;
import com.willfp.eco.core.recipe.Recipes; import com.willfp.eco.core.recipe.Recipes;
import com.willfp.eco.core.recipe.parts.EmptyTestableItem; import com.willfp.eco.core.recipe.parts.EmptyTestableItem;
import com.willfp.eco.core.recipe.parts.TestableStack; import com.willfp.eco.core.recipe.parts.TestableStack;
import lombok.Getter;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -27,25 +26,21 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
/** /**
* Recipe parts. * Recipe parts.
*/ */
@Getter
private final List<TestableItem> parts; private final List<TestableItem> parts;
/** /**
* The key of the recipe. * The key of the recipe.
*/ */
@Getter
private final NamespacedKey key; private final NamespacedKey key;
/** /**
* The key of the displayed recipe. * The key of the displayed recipe.
*/ */
@Getter
private final NamespacedKey displayedKey; private final NamespacedKey displayedKey;
/** /**
* The recipe's output. * The recipe's output.
*/ */
@Getter
private final ItemStack output; private final ItemStack output;
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin, private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
@@ -133,6 +128,42 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
return new Builder(plugin, key); return new Builder(plugin, key);
} }
/**
* Get the parts.
*
* @return The parts.
*/
public List<TestableItem> getParts() {
return this.parts;
}
/**
* Get the key.
*
* @return The key.
*/
public NamespacedKey getKey() {
return this.key;
}
/**
* Get the displayed key.
*
* @return The displayed key.
*/
public NamespacedKey getDisplayedKey() {
return this.displayedKey;
}
/**
* Get the output.
*
* @return The output.
*/
public ItemStack getOutput() {
return this.output;
}
/** /**
* Builder for recipes. * Builder for recipes.
*/ */

View File

@@ -1,14 +1,12 @@
package com.willfp.eco.core.requirement; package com.willfp.eco.core.requirement;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Contains methods and fields pertaining to requirements. * Contains methods and fields pertaining to requirements.
*/ */
@UtilityClass public final class Requirements {
public class Requirements {
/** /**
* Requires a player to have a permission. * Requires a player to have a permission.
*/ */
@@ -38,4 +36,8 @@ public class Requirements {
public static Requirement getByID(@NotNull final String name) { public static Requirement getByID(@NotNull final String name) {
return Eco.getHandler().getRequirementFactory().create(name); return Eco.getHandler().getRequirementFactory().create(name);
} }
private Requirements() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,7 +1,5 @@
package com.willfp.eco.core.tuples; package com.willfp.eco.core.tuples;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
@@ -14,16 +12,12 @@ public class Pair<A, B> {
/** /**
* The first item in the tuple. * The first item in the tuple.
*/ */
@Getter
@Setter
@Nullable @Nullable
private A first; private A first;
/** /**
* The second item in the tuple. * The second item in the tuple.
*/ */
@Getter
@Setter
@Nullable @Nullable
private B second; private B second;
@@ -60,4 +54,40 @@ public class Pair<A, B> {
public B component2() { public B component2() {
return second; return second;
} }
/**
* Get the first member of the tuple.
*
* @return The first member.
*/
public @Nullable A getFirst() {
return this.first;
}
/**
* Get the second member of the tuple.
*
* @return The second member.
*/
public @Nullable B getSecond() {
return this.second;
}
/**
* Set the first member of the tuple.
*
* @param first The data to set.
*/
public void setFirst(@Nullable final A first) {
this.first = first;
}
/**
* Set the second member of the tuple.
*
* @param second The data to set.
*/
public void setSecond(@Nullable final B second) {
this.second = second;
}
} }

View File

@@ -1,7 +1,5 @@
package com.willfp.eco.core.tuples; package com.willfp.eco.core.tuples;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
/** /**
@@ -15,8 +13,6 @@ public class Triplet<A, B, C> extends Pair<A, B> {
/** /**
* The third item in the tuple. * The third item in the tuple.
*/ */
@Getter
@Setter
@Nullable @Nullable
private C third; private C third;
@@ -45,4 +41,22 @@ public class Triplet<A, B, C> extends Pair<A, B> {
public C component3() { public C component3() {
return third; return third;
} }
/**
* Get the third member of the tuple.
*
* @return The third.
*/
public @Nullable C getThird() {
return this.third;
}
/**
* Set the third member of the tuple.
*
* @param third The data to set.
*/
public void setThird(@Nullable final C third) {
this.third = third;
}
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.core.web; package com.willfp.eco.core.web;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.HttpsURLConnection;
@@ -23,7 +22,6 @@ public class Paste {
/** /**
* The contents. * The contents.
*/ */
@Getter
private final String contents; private final String contents;
/** /**
@@ -104,4 +102,13 @@ public class Paste {
return null; return null;
} }
/**
* Get the contents.
*
* @return The contents.
*/
public String getContents() {
return this.contents;
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Arrow; import org.bukkit.entity.Arrow;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.MetadataValue; import org.bukkit.metadata.MetadataValue;
@@ -12,9 +11,7 @@ import java.util.List;
/** /**
* Utilities / API methods for arrows. * Utilities / API methods for arrows.
*/ */
@UtilityClass public final class ArrowUtils {
public class ArrowUtils {
/** /**
* Get the bow from an arrow. * Get the bow from an arrow.
* *
@@ -22,7 +19,7 @@ public class ArrowUtils {
* @return The bow, or null if no bow. * @return The bow, or null if no bow.
*/ */
@Nullable @Nullable
public ItemStack getBow(@NotNull final Arrow arrow) { public static ItemStack getBow(@NotNull final Arrow arrow) {
List<MetadataValue> values = arrow.getMetadata("shot-from"); List<MetadataValue> values = arrow.getMetadata("shot-from");
if (values.isEmpty()) { if (values.isEmpty()) {
@@ -35,4 +32,8 @@ public class ArrowUtils {
return (ItemStack) values.get(0).value(); return (ItemStack) values.get(0).value();
} }
private ArrowUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Chunk; import org.bukkit.Chunk;
import org.bukkit.Location; import org.bukkit.Location;
@@ -21,22 +20,21 @@ import java.util.function.BiConsumer;
/** /**
* Utilities / API methods for blocks. * Utilities / API methods for blocks.
*/ */
@UtilityClass public final class BlockUtils {
public class BlockUtils {
/** /**
* If the meta set function has been set. * If the meta set function has been set.
*/ */
private boolean initialized = false; private static boolean initialized = false;
/** /**
* The block break function. * The block break function.
*/ */
private BiConsumer<Player, Block> blockBreakConsumer = null; private static BiConsumer<Player, Block> blockBreakConsumer = null;
private Set<Block> getNearbyBlocks(@NotNull final Block start, private static Set<Block> getNearbyBlocks(@NotNull final Block start,
@NotNull final List<Material> allowedMaterials, @NotNull final List<Material> allowedMaterials,
@NotNull final Set<Block> blocks, @NotNull final Set<Block> blocks,
final int limit) { final int limit) {
for (BlockFace face : BlockFace.values()) { for (BlockFace face : BlockFace.values()) {
Block block = start.getRelative(face); Block block = start.getRelative(face);
if (blocks.contains(block)) { if (blocks.contains(block)) {
@@ -66,9 +64,9 @@ public class BlockUtils {
* @return A set of all {@link Block}s. * @return A set of all {@link Block}s.
*/ */
@NotNull @NotNull
public Set<Block> getVein(@NotNull final Block start, public static Set<Block> getVein(@NotNull final Block start,
@NotNull final List<Material> allowedMaterials, @NotNull final List<Material> allowedMaterials,
final int limit) { final int limit) {
return getNearbyBlocks(start, allowedMaterials, new HashSet<>(), limit); return getNearbyBlocks(start, allowedMaterials, new HashSet<>(), limit);
} }
@@ -78,8 +76,8 @@ public class BlockUtils {
* @param player The player to break the block as. * @param player The player to break the block as.
* @param block The block to break. * @param block The block to break.
*/ */
public void breakBlock(@NotNull final Player player, public static void breakBlock(@NotNull final Player player,
@NotNull final Block block) { @NotNull final Block block) {
Validate.isTrue(initialized, "Must be initialized!"); Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(blockBreakConsumer, "Must be initialized!"); Validate.notNull(blockBreakConsumer, "Must be initialized!");
@@ -100,7 +98,7 @@ public class BlockUtils {
* @param block The block. * @param block The block.
* @return If placed by a player. * @return If placed by a player.
*/ */
public boolean isPlayerPlaced(@NotNull final Block block) { public static boolean isPlayerPlaced(@NotNull final Block block) {
Chunk chunk = block.getChunk(); Chunk chunk = block.getChunk();
return chunk.getPersistentDataContainer().has( return chunk.getPersistentDataContainer().has(
@@ -115,11 +113,15 @@ public class BlockUtils {
* @param function The function. * @param function The function.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public void initialize(@NotNull final BiConsumer<Player, Block> function) { public static void initialize(@NotNull final BiConsumer<Player, Block> function) {
Validate.isTrue(!initialized, "Already initialized!"); Validate.isTrue(!initialized, "Already initialized!");
blockBreakConsumer = function; blockBreakConsumer = function;
initialized = true; initialized = true;
} }
private BlockUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,13 +1,11 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for classes. * Utilities / API methods for classes.
*/ */
@UtilityClass public final class ClassUtils {
public class ClassUtils {
/** /**
* Get if a class exists. * Get if a class exists.
* *
@@ -15,7 +13,7 @@ public class ClassUtils {
* @return If the class exists. * @return If the class exists.
* @see Class#forName(String) * @see Class#forName(String)
*/ */
public boolean exists(@NotNull final String className) { public static boolean exists(@NotNull final String className) {
try { try {
Class.forName(className); Class.forName(className);
return true; return true;
@@ -23,4 +21,8 @@ public class ClassUtils {
return false; return false;
} }
} }
private ClassUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Sound; import org.bukkit.Sound;
@@ -17,8 +16,7 @@ import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for item durability. * Utilities / API methods for item durability.
*/ */
@UtilityClass public final class DurabilityUtils {
public class DurabilityUtils {
/** /**
* Damage an item in a player's inventory. * Damage an item in a player's inventory.
* The slot of a held item can be obtained with {@link PlayerInventory#getHeldItemSlot()}. * The slot of a held item can be obtained with {@link PlayerInventory#getHeldItemSlot()}.
@@ -29,10 +27,10 @@ public class DurabilityUtils {
* @param damage The amount of damage to deal. * @param damage The amount of damage to deal.
* @param slot The slot in the inventory of the item. * @param slot The slot in the inventory of the item.
*/ */
public void damageItem(@NotNull final Player player, public static void damageItem(@NotNull final Player player,
@NotNull final ItemStack item, @NotNull final ItemStack item,
final int damage, final int damage,
final int slot) { final int slot) {
if (item.getItemMeta() == null) { if (item.getItemMeta() == null) {
return; return;
} }
@@ -78,9 +76,9 @@ public class DurabilityUtils {
* @param damage The amount of damage to deal. * @param damage The amount of damage to deal.
* @param player The player. * @param player The player.
*/ */
public void damageItemNoBreak(@NotNull final ItemStack item, public static void damageItemNoBreak(@NotNull final ItemStack item,
final int damage, final int damage,
@NotNull final Player player) { @NotNull final Player player) {
if (item.getItemMeta() == null) { if (item.getItemMeta() == null) {
return; return;
} }
@@ -114,8 +112,8 @@ public class DurabilityUtils {
* @param item The item to damage. * @param item The item to damage.
* @param repair The amount of damage to heal. * @param repair The amount of damage to heal.
*/ */
public void repairItem(@NotNull final ItemStack item, public static void repairItem(@NotNull final ItemStack item,
final int repair) { final int repair) {
if (item.getItemMeta() == null) { if (item.getItemMeta() == null) {
return; return;
} }
@@ -133,4 +131,8 @@ public class DurabilityUtils {
item.setItemMeta((ItemMeta) meta); item.setItemMeta((ItemMeta) meta);
} }
} }
private DurabilityUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Sound; import org.bukkit.Sound;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
@@ -9,9 +8,7 @@ import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for lightning. * Utilities / API methods for lightning.
*/ */
@UtilityClass public final class LightningUtils {
public class LightningUtils {
/** /**
* Strike lightning on player without fire. * Strike lightning on player without fire.
* *
@@ -19,9 +16,9 @@ public class LightningUtils {
* @param damage The damage to deal. * @param damage The damage to deal.
* @param silent If the lightning sound should be played locally * @param silent If the lightning sound should be played locally
*/ */
public void strike(@NotNull final LivingEntity victim, public static void strike(@NotNull final LivingEntity victim,
final double damage, final double damage,
final boolean silent) { final boolean silent) {
Location loc = victim.getLocation(); Location loc = victim.getLocation();
if (silent) { if (silent) {
@@ -40,8 +37,12 @@ public class LightningUtils {
* @param victim The entity to smite. * @param victim The entity to smite.
* @param damage The damage to deal. * @param damage The damage to deal.
*/ */
public void strike(@NotNull final LivingEntity victim, public static void strike(@NotNull final LivingEntity victim,
final double damage) { final double damage) {
strike(victim, damage, false); strike(victim, damage, false);
} }
private LightningUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -12,8 +11,7 @@ import java.util.Map;
/** /**
* Utilities / API methods for lists. * Utilities / API methods for lists.
*/ */
@UtilityClass public final class ListUtils {
public class ListUtils {
/** /**
* Initialize 2D list of a given size. * Initialize 2D list of a given size.
* *
@@ -57,4 +55,8 @@ public class ListUtils {
return frequencyMap; return frequencyMap;
} }
private ListUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,14 +1,12 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import com.willfp.eco.core.tuples.Pair; import com.willfp.eco.core.tuples.Pair;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for menus. * Utilities / API methods for menus.
*/ */
@UtilityClass public final class MenuUtils {
public class MenuUtils {
/** /**
* Convert 0-53 slot to row and column pair. * Convert 0-53 slot to row and column pair.
* *
@@ -16,9 +14,13 @@ public class MenuUtils {
* @return The pair of row and columns. * @return The pair of row and columns.
*/ */
@NotNull @NotNull
public Pair<Integer, Integer> convertSlotToRowColumn(final int slot) { public static Pair<Integer, Integer> convertSlotToRowColumn(final int slot) {
int row = Math.floorDiv(slot, 9); int row = Math.floorDiv(slot, 9);
int column = slot - row * 9; int column = slot - row * 9;
return new Pair<>(row + 1, column + 1); return new Pair<>(row + 1, column + 1);
} }
private MenuUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -9,8 +8,7 @@ import java.util.Objects;
/** /**
* Utilities / API methods for {@link NamespacedKey}s. * Utilities / API methods for {@link NamespacedKey}s.
*/ */
@UtilityClass public final class NamespacedKeyUtils {
public class NamespacedKeyUtils {
/** /**
* Create a NamespacedKey for eco. * Create a NamespacedKey for eco.
* *
@@ -18,7 +16,7 @@ public class NamespacedKeyUtils {
* @return The key. * @return The key.
*/ */
@NotNull @NotNull
public NamespacedKey createEcoKey(@NotNull final String string) { public static NamespacedKey createEcoKey(@NotNull final String string) {
return Objects.requireNonNull(NamespacedKey.fromString("eco:" + string)); return Objects.requireNonNull(NamespacedKey.fromString("eco:" + string));
} }
@@ -30,8 +28,12 @@ public class NamespacedKeyUtils {
* @return The key. * @return The key.
*/ */
@NotNull @NotNull
public NamespacedKey create(@NotNull final String namespace, public static NamespacedKey create(@NotNull final String namespace,
@NotNull final String key) { @NotNull final String key) {
return Objects.requireNonNull(NamespacedKey.fromString(namespace + ":" + key)); return Objects.requireNonNull(NamespacedKey.fromString(namespace + ":" + key));
} }
private NamespacedKeyUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.text.DecimalFormat; import java.text.DecimalFormat;
@@ -11,8 +10,7 @@ import java.util.concurrent.ThreadLocalRandom;
/** /**
* Utilities / API methods for numbers. * Utilities / API methods for numbers.
*/ */
@UtilityClass public final class NumberUtils {
public class NumberUtils {
/** /**
* Sin lookup table. * Sin lookup table.
*/ */
@@ -72,8 +70,8 @@ public class NumberUtils {
* @param bias The bias between -1 and 1, where higher values bias input values to lower output values. * @param bias The bias between -1 and 1, where higher values bias input values to lower output values.
* @return The biased output. * @return The biased output.
*/ */
public double bias(final double input, public static double bias(final double input,
final double bias) { final double bias) {
double k = Math.pow(1 - bias, 3); double k = Math.pow(1 - bias, 3);
return (input * k) / (input * k - input + 1); return (input * k) / (input * k - input + 1);
@@ -86,8 +84,8 @@ public class NumberUtils {
* @param limit The maximum. * @param limit The maximum.
* @return The new value. * @return The new value.
*/ */
public int equalIfOver(final int toChange, public static int equalIfOver(final int toChange,
final int limit) { final int limit) {
return Math.min(toChange, limit); return Math.min(toChange, limit);
} }
@@ -98,8 +96,8 @@ public class NumberUtils {
* @param limit The maximum. * @param limit The maximum.
* @return The new value. * @return The new value.
*/ */
public double equalIfOver(final double toChange, public static double equalIfOver(final double toChange,
final double limit) { final double limit) {
return Math.min(toChange, limit); return Math.min(toChange, limit);
} }
@@ -110,7 +108,7 @@ public class NumberUtils {
* @return The number, converted to a roman numeral. * @return The number, converted to a roman numeral.
*/ */
@NotNull @NotNull
public String toNumeral(final int number) { public static String toNumeral(final int number) {
if (number >= 1 && number <= 4096) { if (number >= 1 && number <= 4096) {
int l = NUMERALS.floorKey(number); int l = NUMERALS.floorKey(number);
if (number == l) { if (number == l) {
@@ -147,8 +145,8 @@ public class NumberUtils {
* @param max Maximum. * @param max Maximum.
* @return Random integer. * @return Random integer.
*/ */
public int randInt(final int min, public static int randInt(final int min,
final int max) { final int max) {
return ThreadLocalRandom.current().nextInt(min, max + 1); return ThreadLocalRandom.current().nextInt(min, max + 1);
} }
@@ -159,8 +157,8 @@ public class NumberUtils {
* @param max Maximum. * @param max Maximum.
* @return Random double. * @return Random double.
*/ */
public double randFloat(final double min, public static double randFloat(final double min,
final double max) { final double max) {
return ThreadLocalRandom.current().nextDouble(min, max); return ThreadLocalRandom.current().nextDouble(min, max);
} }
@@ -172,9 +170,9 @@ public class NumberUtils {
* @param peak Peak. * @param peak Peak.
* @return Random double. * @return Random double.
*/ */
public double triangularDistribution(final double minimum, public static double triangularDistribution(final double minimum,
final double maximum, final double maximum,
final double peak) { final double peak) {
double f = (peak - minimum) / (maximum - minimum); double f = (peak - minimum) / (maximum - minimum);
double rand = Math.random(); double rand = Math.random();
if (rand < f) { if (rand < f) {
@@ -190,7 +188,7 @@ public class NumberUtils {
* @param toLog The number. * @param toLog The number.
* @return The result. * @return The result.
*/ */
public int log2(final int toLog) { public static int log2(final int toLog) {
return (int) (Math.log(toLog) / Math.log(2)); return (int) (Math.log(toLog) / Math.log(2));
} }
@@ -201,10 +199,14 @@ public class NumberUtils {
* @return Formatted. * @return Formatted.
*/ */
@NotNull @NotNull
public String format(final double toFormat) { public static String format(final double toFormat) {
DecimalFormat df = new DecimalFormat("0.00"); DecimalFormat df = new DecimalFormat("0.00");
String formatted = df.format(toFormat); String formatted = df.format(toFormat);
return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted; return formatted.endsWith("00") ? String.valueOf((int) toFormat) : formatted;
} }
private NumberUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -5,7 +5,6 @@ import com.willfp.eco.core.Prerequisite;
import com.willfp.eco.core.data.PlayerProfile; import com.willfp.eco.core.data.PlayerProfile;
import com.willfp.eco.core.data.keys.PersistentDataKey; import com.willfp.eco.core.data.keys.PersistentDataKey;
import com.willfp.eco.core.data.keys.PersistentDataKeyType; import com.willfp.eco.core.data.keys.PersistentDataKeyType;
import lombok.experimental.UtilityClass;
import net.kyori.adventure.audience.Audience; import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitAudiences; import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.OfflinePlayer; import org.bukkit.OfflinePlayer;
@@ -16,8 +15,7 @@ import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for players. * Utilities / API methods for players.
*/ */
@UtilityClass public final class PlayerUtils {
public class PlayerUtils {
/** /**
* The data key for saved player names. * The data key for saved player names.
*/ */
@@ -34,7 +32,7 @@ public class PlayerUtils {
* @return The audience. * @return The audience.
*/ */
@NotNull @NotNull
public Audience getAudience(@NotNull final Player player) { public static Audience getAudience(@NotNull final Player player) {
BukkitAudiences adventure = Eco.getHandler().getAdventure(); BukkitAudiences adventure = Eco.getHandler().getAdventure();
if (Prerequisite.HAS_PAPER.isMet()) { if (Prerequisite.HAS_PAPER.isMet()) {
@@ -59,7 +57,7 @@ public class PlayerUtils {
* @return The audience. * @return The audience.
*/ */
@NotNull @NotNull
public Audience getAudience(@NotNull final CommandSender sender) { public static Audience getAudience(@NotNull final CommandSender sender) {
BukkitAudiences adventure = Eco.getHandler().getAdventure(); BukkitAudiences adventure = Eco.getHandler().getAdventure();
if (Prerequisite.HAS_PAPER.isMet()) { if (Prerequisite.HAS_PAPER.isMet()) {
@@ -83,14 +81,24 @@ public class PlayerUtils {
* @param player The player. * @param player The player.
* @return The player name. * @return The player name.
*/ */
public String getSavedDisplayName(@NotNull final OfflinePlayer player) { public static String getSavedDisplayName(@NotNull final OfflinePlayer player) {
PlayerProfile profile = PlayerProfile.load(player); PlayerProfile profile = PlayerProfile.load(player);
if (player instanceof Player onlinePlayer) { if (player instanceof Player onlinePlayer) {
profile.write(PLAYER_NAME_KEY, onlinePlayer.getDisplayName()); profile.write(PLAYER_NAME_KEY, onlinePlayer.getDisplayName());
} }
return profile.read(PLAYER_NAME_KEY); String saved = profile.read(PLAYER_NAME_KEY);
if (saved.equals(PLAYER_NAME_KEY.getDefaultValue())) {
String name = player.getName();
if (name != null) {
profile.write(PLAYER_NAME_KEY, player.getName());
return player.getName();
}
}
return saved;
} }
/** /**
@@ -98,8 +106,12 @@ public class PlayerUtils {
* *
* @param player The player. * @param player The player.
*/ */
public void updateSavedDisplayName(@NotNull final Player player) { public static void updateSavedDisplayName(@NotNull final Player player) {
PlayerProfile profile = PlayerProfile.load(player); PlayerProfile profile = PlayerProfile.load(player);
profile.write(PLAYER_NAME_KEY, player.getDisplayName()); profile.write(PLAYER_NAME_KEY, player.getDisplayName());
} }
private PlayerUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,21 +1,19 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.potion.PotionData; import org.bukkit.potion.PotionData;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Utilities / API methods for potions. * Utilities / API methods for potions.
*/ */
@UtilityClass public final class PotionUtils {
public class PotionUtils {
/** /**
* Get the duration (in ticks) for potion data. * Get the duration (in ticks) for potion data.
* *
* @param data The data. * @param data The data.
* @return The duration. * @return The duration.
*/ */
public int getDuration(@NotNull final PotionData data) { public static int getDuration(@NotNull final PotionData data) {
if (data.isExtended()) { if (data.isExtended()) {
return switch (data.getType()) { return switch (data.getType()) {
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0; case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
@@ -44,4 +42,8 @@ public class PotionUtils {
default: yield 3600; default: yield 3600;
}; };
} }
private PotionUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,19 +9,18 @@ import java.util.function.Supplier;
/** /**
* Utilities / API methods for the server. * Utilities / API methods for the server.
*/ */
@UtilityClass public final class ServerUtils {
public class ServerUtils {
/** /**
* The TPS supplier. * The TPS supplier.
*/ */
private Supplier<Double> tpsSupplier = null; private static Supplier<Double> tpsSupplier = null;
/** /**
* Get the current server TPS. * Get the current server TPS.
* *
* @return The TPS. * @return The TPS.
*/ */
public double getTps() { public static double getTps() {
Validate.notNull(tpsSupplier, "Not initialized!"); Validate.notNull(tpsSupplier, "Not initialized!");
double tps = tpsSupplier.get(); double tps = tpsSupplier.get();
@@ -40,9 +38,13 @@ public class ServerUtils {
* @param function The function. * @param function The function.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public void initialize(@NotNull final Supplier<Double> function) { public static void initialize(@NotNull final Supplier<Double> function) {
Validate.isTrue(tpsSupplier == null, "Already initialized!"); Validate.isTrue(tpsSupplier == null, "Already initialized!");
tpsSupplier = function; tpsSupplier = function;
} }
private ServerUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.ApiStatus;
@@ -13,22 +12,21 @@ import java.util.function.Function;
/** /**
* Utilities / API methods for player heads. * Utilities / API methods for player heads.
*/ */
@UtilityClass public final class SkullUtils {
public class SkullUtils {
/** /**
* If the meta set function has been set. * If the meta set function has been set.
*/ */
private boolean initialized = false; private static boolean initialized = false;
/** /**
* The meta set function. * The meta set function.
*/ */
private BiConsumer<SkullMeta, String> metaSetConsumer = null; private static BiConsumer<SkullMeta, String> metaSetConsumer = null;
/** /**
* The meta get function. * The meta get function.
*/ */
private Function<SkullMeta, String> metaGetConsumer = null; private static Function<SkullMeta, String> metaGetConsumer = null;
/** /**
* Set the texture of a skull from base64. * Set the texture of a skull from base64.
@@ -36,7 +34,7 @@ public class SkullUtils {
* @param meta The meta to modify. * @param meta The meta to modify.
* @param base64 The base64 texture. * @param base64 The base64 texture.
*/ */
public void setSkullTexture(@NotNull final SkullMeta meta, public static void setSkullTexture(@NotNull final SkullMeta meta,
@NotNull final String base64) { @NotNull final String base64) {
Validate.isTrue(initialized, "Must be initialized!"); Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaSetConsumer, "Must be initialized!"); Validate.notNull(metaSetConsumer, "Must be initialized!");
@@ -51,7 +49,7 @@ public class SkullUtils {
* @return The texture, potentially null. * @return The texture, potentially null.
*/ */
@Nullable @Nullable
public String getSkullTexture(@NotNull final SkullMeta meta) { public static String getSkullTexture(@NotNull final SkullMeta meta) {
Validate.isTrue(initialized, "Must be initialized!"); Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaGetConsumer, "Must be initialized!"); Validate.notNull(metaGetConsumer, "Must be initialized!");
@@ -65,7 +63,7 @@ public class SkullUtils {
* @param function2 Get function. * @param function2 Get function.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public void initialize(@NotNull final BiConsumer<SkullMeta, String> function, public static void initialize(@NotNull final BiConsumer<SkullMeta, String> function,
@NotNull final Function<SkullMeta, String> function2) { @NotNull final Function<SkullMeta, String> function2) {
Validate.isTrue(!initialized, "Already initialized!"); Validate.isTrue(!initialized, "Already initialized!");
@@ -73,4 +71,8 @@ public class SkullUtils {
metaGetConsumer = function2; metaGetConsumer = function2;
initialized = true; initialized = true;
} }
private SkullUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -4,7 +4,6 @@ import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableMap;
import com.willfp.eco.core.Prerequisite; import com.willfp.eco.core.Prerequisite;
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager; import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
import lombok.experimental.UtilityClass;
import net.kyori.adventure.text.Component; import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration; import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.minimessage.MiniMessage; import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -25,18 +24,10 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import static net.md_5.bungee.api.ChatColor.BOLD;
import static net.md_5.bungee.api.ChatColor.COLOR_CHAR;
import static net.md_5.bungee.api.ChatColor.ITALIC;
import static net.md_5.bungee.api.ChatColor.MAGIC;
import static net.md_5.bungee.api.ChatColor.STRIKETHROUGH;
import static net.md_5.bungee.api.ChatColor.UNDERLINE;
/** /**
* Utilities / API methods for strings. * Utilities / API methods for strings.
*/ */
@UtilityClass public final class StringUtils {
public class StringUtils {
/** /**
* Regexes for gradients. * Regexes for gradients.
*/ */
@@ -72,16 +63,16 @@ public class StringUtils {
* Color map. * Color map.
*/ */
private static final Map<String, ChatColor> COLOR_MAP = new ImmutableMap.Builder<String, ChatColor>() private static final Map<String, ChatColor> COLOR_MAP = new ImmutableMap.Builder<String, ChatColor>()
.put("&l", BOLD) .put("&l", ChatColor.BOLD)
.put("&o", ITALIC) .put("&o", ChatColor.ITALIC)
.put("&n", UNDERLINE) .put("&n", ChatColor.UNDERLINE)
.put("&m", STRIKETHROUGH) .put("&m", ChatColor.STRIKETHROUGH)
.put("&k", MAGIC) .put("&k", ChatColor.MAGIC)
.put("§l", BOLD) .put("§l", ChatColor.BOLD)
.put("§o", ITALIC) .put("§o", ChatColor.ITALIC)
.put("§n", UNDERLINE) .put("§n", ChatColor.UNDERLINE)
.put("§m", STRIKETHROUGH) .put("§m", ChatColor.STRIKETHROUGH)
.put("§k", MAGIC) .put("§k", ChatColor.MAGIC)
.build(); .build();
/** /**
@@ -93,7 +84,7 @@ public class StringUtils {
* @return The message, formatted. * @return The message, formatted.
*/ */
@NotNull @NotNull
public List<String> formatList(@NotNull final List<String> list) { public static List<String> formatList(@NotNull final List<String> list) {
return formatList(list, (Player) null); return formatList(list, (Player) null);
} }
@@ -107,8 +98,8 @@ public class StringUtils {
* @return The message, format. * @return The message, format.
*/ */
@NotNull @NotNull
public List<String> formatList(@NotNull final List<String> list, public static List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player) { @Nullable final Player player) {
return formatList(list, player, FormatOption.WITH_PLACEHOLDERS); return formatList(list, player, FormatOption.WITH_PLACEHOLDERS);
} }
@@ -122,8 +113,8 @@ public class StringUtils {
* @return The message, formatted. * @return The message, formatted.
*/ */
@NotNull @NotNull
public List<String> formatList(@NotNull final List<String> list, public static List<String> formatList(@NotNull final List<String> list,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
return formatList(list, null, option); return formatList(list, null, option);
} }
@@ -138,9 +129,9 @@ public class StringUtils {
* @return The message, format. * @return The message, format.
*/ */
@NotNull @NotNull
public List<String> formatList(@NotNull final List<String> list, public static List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player, @Nullable final Player player,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
List<String> translated = new ArrayList<>(); List<String> translated = new ArrayList<>();
for (String string : list) { for (String string : list) {
translated.add(format(string, player, option)); translated.add(format(string, player, option));
@@ -159,7 +150,7 @@ public class StringUtils {
* @see StringUtils#format(String, Player) * @see StringUtils#format(String, Player)
*/ */
@NotNull @NotNull
public String format(@NotNull final String message) { public static String format(@NotNull final String message) {
return format(message, (Player) null); return format(message, (Player) null);
} }
@@ -173,8 +164,8 @@ public class StringUtils {
* @return The message, formatted. * @return The message, formatted.
*/ */
@NotNull @NotNull
public String format(@NotNull final String message, public static String format(@NotNull final String message,
@Nullable final Player player) { @Nullable final Player player) {
return format(message, player, FormatOption.WITH_PLACEHOLDERS); return format(message, player, FormatOption.WITH_PLACEHOLDERS);
} }
@@ -189,8 +180,8 @@ public class StringUtils {
* @see StringUtils#format(String, Player) * @see StringUtils#format(String, Player)
*/ */
@NotNull @NotNull
public String format(@NotNull final String message, public static String format(@NotNull final String message,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
return format(message, null, option); return format(message, null, option);
} }
@@ -204,7 +195,7 @@ public class StringUtils {
* @see StringUtils#format(String, Player) * @see StringUtils#format(String, Player)
*/ */
@NotNull @NotNull
public Component formatToComponent(@NotNull final String message) { public static Component formatToComponent(@NotNull final String message) {
return formatToComponent(message, (Player) null); return formatToComponent(message, (Player) null);
} }
@@ -218,8 +209,8 @@ public class StringUtils {
* @return The message, formatted. * @return The message, formatted.
*/ */
@NotNull @NotNull
public Component formatToComponent(@NotNull final String message, public static Component formatToComponent(@NotNull final String message,
@Nullable final Player player) { @Nullable final Player player) {
return formatToComponent(message, player, FormatOption.WITH_PLACEHOLDERS); return formatToComponent(message, player, FormatOption.WITH_PLACEHOLDERS);
} }
@@ -234,8 +225,8 @@ public class StringUtils {
* @see StringUtils#format(String, Player) * @see StringUtils#format(String, Player)
*/ */
@NotNull @NotNull
public Component formatToComponent(@NotNull final String message, public static Component formatToComponent(@NotNull final String message,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
return formatToComponent(message, null, option); return formatToComponent(message, null, option);
} }
@@ -250,9 +241,9 @@ public class StringUtils {
* @return The message, formatted, as a component. * @return The message, formatted, as a component.
*/ */
@NotNull @NotNull
public Component formatToComponent(@NotNull final String message, public static Component formatToComponent(@NotNull final String message,
@Nullable final Player player, @Nullable final Player player,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
return toComponent(format(message, player, option)); return toComponent(format(message, player, option));
} }
@@ -267,9 +258,9 @@ public class StringUtils {
* @return The message, formatted. * @return The message, formatted.
*/ */
@NotNull @NotNull
public String format(@NotNull final String message, public static String format(@NotNull final String message,
@Nullable final Player player, @Nullable final Player player,
@NotNull final FormatOption option) { @NotNull final FormatOption option) {
String processedMessage = message; String processedMessage = message;
if (option == FormatOption.WITH_PLACEHOLDERS) { if (option == FormatOption.WITH_PLACEHOLDERS) {
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player); processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
@@ -302,10 +293,10 @@ public class StringUtils {
StringBuilder builder = new StringBuilder(message.length() + 4 * 8); StringBuilder builder = new StringBuilder(message.length() + 4 * 8);
while (matcher.find()) { while (matcher.find()) {
String group = matcher.group(1); String group = matcher.group(1);
matcher.appendReplacement(builder, COLOR_CHAR + "x" matcher.appendReplacement(builder, ChatColor.COLOR_CHAR + "x"
+ COLOR_CHAR + group.charAt(0) + COLOR_CHAR + group.charAt(1) + ChatColor.COLOR_CHAR + group.charAt(0) + ChatColor.COLOR_CHAR + group.charAt(1)
+ COLOR_CHAR + group.charAt(2) + COLOR_CHAR + group.charAt(3) + ChatColor.COLOR_CHAR + group.charAt(2) + ChatColor.COLOR_CHAR + group.charAt(3)
+ COLOR_CHAR + group.charAt(4) + COLOR_CHAR + group.charAt(5)); + ChatColor.COLOR_CHAR + group.charAt(4) + ChatColor.COLOR_CHAR + group.charAt(5));
} }
return matcher.appendTail(builder).toString(); return matcher.appendTail(builder).toString();
@@ -379,7 +370,7 @@ public class StringUtils {
* @return The object stringified. * @return The object stringified.
*/ */
@NotNull @NotNull
public String internalToString(@Nullable final Object object) { public static String internalToString(@Nullable final Object object) {
if (object == null) { if (object == null) {
return "null"; return "null";
} }
@@ -405,8 +396,8 @@ public class StringUtils {
* @return The string with the prefix removed. * @return The string with the prefix removed.
*/ */
@NotNull @NotNull
public String removePrefix(@NotNull final String string, public static String removePrefix(@NotNull final String string,
@NotNull final String prefix) { @NotNull final String prefix) {
if (string.startsWith(prefix)) { if (string.startsWith(prefix)) {
return string.substring(prefix.length()); return string.substring(prefix.length());
} }
@@ -420,7 +411,7 @@ public class StringUtils {
* @return The JSON String. * @return The JSON String.
*/ */
@NotNull @NotNull
public String legacyToJson(@Nullable final String legacy) { public static String legacyToJson(@Nullable final String legacy) {
String processed = legacy; String processed = legacy;
if (legacy == null) { if (legacy == null) {
processed = ""; processed = "";
@@ -439,7 +430,7 @@ public class StringUtils {
* @return The legacy string. * @return The legacy string.
*/ */
@NotNull @NotNull
public String jsonToLegacy(@NotNull final String json) { public static String jsonToLegacy(@NotNull final String json) {
return LEGACY_COMPONENT_SERIALIZER.serialize( return LEGACY_COMPONENT_SERIALIZER.serialize(
GsonComponentSerializer.gson().deserialize(json) GsonComponentSerializer.gson().deserialize(json)
); );
@@ -452,7 +443,7 @@ public class StringUtils {
* @return The component. * @return The component.
*/ */
@NotNull @NotNull
public Component toComponent(@Nullable final String legacy) { public static Component toComponent(@Nullable final String legacy) {
String processed = legacy; String processed = legacy;
if (legacy == null) { if (legacy == null) {
processed = ""; processed = "";
@@ -468,7 +459,7 @@ public class StringUtils {
* @return The legacy text. * @return The legacy text.
*/ */
@NotNull @NotNull
public String toLegacy(@NotNull final Component component) { public static String toLegacy(@NotNull final Component component) {
return LEGACY_COMPONENT_SERIALIZER.serialize(component); return LEGACY_COMPONENT_SERIALIZER.serialize(component);
} }
@@ -486,4 +477,8 @@ public class StringUtils {
*/ */
WITHOUT_PLACEHOLDERS WITHOUT_PLACEHOLDERS
} }
private StringUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -3,7 +3,6 @@ package com.willfp.eco.util;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import com.willfp.eco.core.Prerequisite; import com.willfp.eco.core.Prerequisite;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.ChatColor; import org.bukkit.ChatColor;
import org.bukkit.Material; import org.bukkit.Material;
@@ -13,13 +12,13 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* Utilities / API methods for teams. * Utilities / API methods for teams.
*/ */
@UtilityClass public final class TeamUtils {
public class TeamUtils {
/** /**
* Ore ChatColors. * Ore ChatColors.
*/ */
@@ -33,7 +32,7 @@ public class TeamUtils {
/** /**
* The server scoreboard. * The server scoreboard.
*/ */
private static final Scoreboard SCOREBOARD = Bukkit.getScoreboardManager().getMainScoreboard(); private static final Scoreboard SCOREBOARD = Objects.requireNonNull(Bukkit.getScoreboardManager()).getMainScoreboard();
/** /**
* Get team from {@link ChatColor}. * Get team from {@link ChatColor}.
@@ -44,7 +43,7 @@ public class TeamUtils {
* @return The team. * @return The team.
*/ */
@NotNull @NotNull
public Team fromChatColor(@NotNull final ChatColor color) { public static Team fromChatColor(@NotNull final ChatColor color) {
if (CHAT_COLOR_TEAMS.containsKey(color)) { if (CHAT_COLOR_TEAMS.containsKey(color)) {
return CHAT_COLOR_TEAMS.get(color); return CHAT_COLOR_TEAMS.get(color);
} }
@@ -72,7 +71,7 @@ public class TeamUtils {
* @return The team. * @return The team.
*/ */
@NotNull @NotNull
public Team getMaterialColorTeam(@NotNull final Material material) { public static Team getMaterialColorTeam(@NotNull final Material material) {
return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE)); return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE));
} }
@@ -102,4 +101,8 @@ public class TeamUtils {
MATERIAL_COLORS.put(Material.DEEPSLATE_EMERALD_ORE, ChatColor.GREEN); MATERIAL_COLORS.put(Material.DEEPSLATE_EMERALD_ORE, ChatColor.GREEN);
} }
} }
private TeamUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,7 +13,6 @@ import java.util.function.Function;
* Telekinesis means that all drops and xp go straight to a player's inventory * Telekinesis means that all drops and xp go straight to a player's inventory
* rather than dropping on the ground. * rather than dropping on the ground.
*/ */
@UtilityClass
public final class TelekinesisUtils { public final class TelekinesisUtils {
/** /**
* Set of tests that return if the player is telekinetic. * Set of tests that return if the player is telekinetic.
@@ -26,7 +24,7 @@ public final class TelekinesisUtils {
* *
* @param test The test to register, where the boolean output is if the player is telekinetic. * @param test The test to register, where the boolean output is if the player is telekinetic.
*/ */
public void registerTest(@NotNull final Function<Player, Boolean> test) { public static void registerTest(@NotNull final Function<Player, Boolean> test) {
TESTS.add(test); TESTS.add(test);
} }
@@ -38,7 +36,7 @@ public final class TelekinesisUtils {
* @param player The player to test. * @param player The player to test.
* @return If the player is telekinetic. * @return If the player is telekinetic.
*/ */
public boolean testPlayer(@NotNull final Player player) { public static boolean testPlayer(@NotNull final Player player) {
for (Function<Player, Boolean> test : TESTS) { for (Function<Player, Boolean> test : TESTS) {
if (test.apply(player)) { if (test.apply(player)) {
return true; return true;
@@ -47,4 +45,8 @@ public final class TelekinesisUtils {
return false; return false;
} }
private TelekinesisUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import lombok.experimental.UtilityClass;
import org.bukkit.util.NumberConversions; import org.bukkit.util.NumberConversions;
import org.bukkit.util.Vector; import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -13,8 +12,7 @@ import java.util.Map;
/** /**
* Utilities / API methods for vectors. * Utilities / API methods for vectors.
*/ */
@UtilityClass public final class VectorUtils {
public class VectorUtils {
/** /**
* Cached circles to prevent many sqrt calls. * Cached circles to prevent many sqrt calls.
*/ */
@@ -26,7 +24,7 @@ public class VectorUtils {
* @param vector The vector to check. * @param vector The vector to check.
* @return If the vector is finite. * @return If the vector is finite.
*/ */
public boolean isFinite(@NotNull final Vector vector) { public static boolean isFinite(@NotNull final Vector vector) {
try { try {
NumberConversions.checkFinite(vector.getX(), "x not finite"); NumberConversions.checkFinite(vector.getX(), "x not finite");
NumberConversions.checkFinite(vector.getY(), "y not finite"); NumberConversions.checkFinite(vector.getY(), "y not finite");
@@ -45,7 +43,7 @@ public class VectorUtils {
* @return The vector, simplified. * @return The vector, simplified.
*/ */
@NotNull @NotNull
public Vector simplifyVector(@NotNull final Vector vec) { public static Vector simplifyVector(@NotNull final Vector vec) {
double x = Math.abs(vec.getX()); double x = Math.abs(vec.getX());
double y = Math.abs(vec.getY()); double y = Math.abs(vec.getY());
double z = Math.abs(vec.getZ()); double z = Math.abs(vec.getZ());
@@ -78,7 +76,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s. * @return An array of {@link Vector}s.
*/ */
@NotNull @NotNull
public Vector[] getCircle(final int radius) { public static Vector[] getCircle(final int radius) {
Vector[] cached = CIRCLE_CACHE.get(radius); Vector[] cached = CIRCLE_CACHE.get(radius);
if (cached != null) { if (cached != null) {
return cached; return cached;
@@ -115,7 +113,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s. * @return An array of {@link Vector}s.
*/ */
@NotNull @NotNull
public Vector[] getSquare(final int radius) { public static Vector[] getSquare(final int radius) {
List<Vector> vectors = new ArrayList<>(); List<Vector> vectors = new ArrayList<>();
int xoffset = -radius; int xoffset = -radius;
@@ -140,7 +138,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s. * @return An array of {@link Vector}s.
*/ */
@NotNull @NotNull
public Vector[] getCube(final int radius) { public static Vector[] getCube(final int radius) {
List<Vector> vectors = new ArrayList<>(); List<Vector> vectors = new ArrayList<>();
for (int y = -radius; y <= radius; y++) { for (int y = -radius; y <= radius; y++) {
@@ -153,4 +151,8 @@ public class VectorUtils {
return vectors.toArray(new Vector[0]); return vectors.toArray(new Vector[0]);
} }
private VectorUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
}
} }

View File

@@ -4,12 +4,15 @@ import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import java.util.* import java.util.Objects
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
open class EcoJSONConfigWrapper : JSONConfig { open class EcoJSONConfigWrapper : JSONConfig {
val handle: Gson = GsonBuilder().setPrettyPrinting().create() val handle: Gson = GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
.create()
val values = ConcurrentHashMap<String, Any?>() val values = ConcurrentHashMap<String, Any?>()
@@ -273,6 +276,6 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
override fun clone(): JSONConfig { override fun clone(): JSONConfig {
return EcoJSONConfigSection(HashMap<String, Any>(this.values)) return EcoJSONConfigSection(this.values.toMutableMap())
} }
} }

View File

@@ -2,16 +2,43 @@ package com.willfp.eco.internal.data
import com.willfp.eco.core.data.PlayerProfile import com.willfp.eco.core.data.PlayerProfile
import com.willfp.eco.core.data.keys.PersistentDataKey import com.willfp.eco.core.data.keys.PersistentDataKey
import java.util.*
import java.util.concurrent.ConcurrentHashMap
class EcoPlayerProfile( class EcoPlayerProfile(
val data: MutableMap<PersistentDataKey<*>, Any> val data: MutableMap<PersistentDataKey<*>, Any>,
val uuid: UUID
) : PlayerProfile { ) : PlayerProfile {
override fun <T : Any> write(key: PersistentDataKey<T>, value: T) { override fun <T : Any> write(key: PersistentDataKey<T>, value: T) {
this.data[key] = value this.data[key] = value
val changedKeys = CHANGE_MAP[uuid] ?: mutableSetOf()
changedKeys.add(key)
CHANGE_MAP[uuid] = changedKeys
} }
override fun <T : Any> read(key: PersistentDataKey<T>): T { override fun <T : Any> read(key: PersistentDataKey<T>): T {
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
return this.data[key] as T? ?: key.defaultValue return this.data[key] as T? ?: key.defaultValue
} }
override fun equals(other: Any?): Boolean {
if (other !is EcoPlayerProfile) {
return false
}
return this.data == other.data
}
override fun hashCode(): Int {
return data.hashCode()
}
override fun toString(): String {
return "EcoPlayerProfile{$data}"
}
companion object {
val CHANGE_MAP: MutableMap<UUID, MutableSet<PersistentDataKey<*>>> = ConcurrentHashMap()
}
} }

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.internal.display package com.willfp.eco.internal.display
import com.google.common.util.concurrent.ThreadFactoryBuilder
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.display.Display import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayHandler import com.willfp.eco.core.display.DisplayHandler
@@ -11,8 +10,6 @@ import org.bukkit.NamespacedKey
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class EcoDisplayHandler(plugin: EcoPlugin) : DisplayHandler { class EcoDisplayHandler(plugin: EcoPlugin) : DisplayHandler {
private val registeredModules = mutableMapOf<DisplayPriority, MutableList<DisplayModule>>() private val registeredModules = mutableMapOf<DisplayPriority, MutableList<DisplayModule>>()

View File

@@ -40,6 +40,7 @@ dependencies {
compileOnly 'com.github.MilkBowl:VaultAPI:1.7' compileOnly 'com.github.MilkBowl:VaultAPI:1.7'
compileOnly 'world.bentobox:bentobox:1.17.3-SNAPSHOT' compileOnly 'world.bentobox:bentobox:1.17.3-SNAPSHOT'
compileOnly 'com.google.guava:guava:31.0.1-jre' compileOnly 'com.google.guava:guava:31.0.1-jre'
compileOnly 'com.iridium:IridiumSkyblock:3.1.2'
// CombatLogX V10 + NewbieHelper Expansion // CombatLogX V10 + NewbieHelper Expansion
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT' compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'

View File

@@ -38,6 +38,8 @@ import com.willfp.eco.internal.scheduling.EcoScheduler
import com.willfp.eco.proxy.FastItemStackFactoryProxy import com.willfp.eco.proxy.FastItemStackFactoryProxy
import com.willfp.eco.spigot.data.EcoKeyRegistry import com.willfp.eco.spigot.data.EcoKeyRegistry
import com.willfp.eco.spigot.data.EcoPlayerProfileHandler import com.willfp.eco.spigot.data.EcoPlayerProfileHandler
import com.willfp.eco.spigot.data.storage.MySQLDataHandler
import com.willfp.eco.spigot.data.storage.YamlDataHandler
import com.willfp.eco.spigot.integrations.bstats.MetricHandler import com.willfp.eco.spigot.integrations.bstats.MetricHandler
import net.kyori.adventure.platform.bukkit.BukkitAudiences import net.kyori.adventure.platform.bukkit.BukkitAudiences
import org.bukkit.inventory.ItemStack import org.bukkit.inventory.ItemStack
@@ -49,7 +51,10 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
private val requirementFactory = EcoRequirementFactory() private val requirementFactory = EcoRequirementFactory()
private var adventure: BukkitAudiences? = null private var adventure: BukkitAudiences? = null
private val keyRegistry = EcoKeyRegistry(this) private val keyRegistry = EcoKeyRegistry(this)
private val playerProfileHandler = EcoPlayerProfileHandler(this) private val playerProfileHandler = EcoPlayerProfileHandler(
if (this.configYml.getBool("mysql.enabled"))
MySQLDataHandler(this) else YamlDataHandler(this)
)
override fun createScheduler(plugin: EcoPlugin): Scheduler { override fun createScheduler(plugin: EcoPlugin): Scheduler {
return EcoScheduler(plugin) return EcoScheduler(plugin)

View File

@@ -25,17 +25,9 @@ import com.willfp.eco.proxy.SkullProxy
import com.willfp.eco.proxy.TPSProxy import com.willfp.eco.proxy.TPSProxy
import com.willfp.eco.spigot.arrows.ArrowDataListener import com.willfp.eco.spigot.arrows.ArrowDataListener
import com.willfp.eco.spigot.data.DataListener import com.willfp.eco.spigot.data.DataListener
import com.willfp.eco.spigot.data.EcoPlayerProfileHandler
import com.willfp.eco.spigot.data.PlayerBlockListener import com.willfp.eco.spigot.data.PlayerBlockListener
import com.willfp.eco.spigot.data.storage.DataHandler import com.willfp.eco.spigot.data.storage.ProfileSaver
import com.willfp.eco.spigot.data.storage.MySQLDataHandler import com.willfp.eco.spigot.display.*
import com.willfp.eco.spigot.data.storage.YamlDataHandler
import com.willfp.eco.spigot.display.PacketAutoRecipe
import com.willfp.eco.spigot.display.PacketChat
import com.willfp.eco.spigot.display.PacketOpenWindowMerchant
import com.willfp.eco.spigot.display.PacketSetCreativeSlot
import com.willfp.eco.spigot.display.PacketSetSlot
import com.willfp.eco.spigot.display.PacketWindowItems
import com.willfp.eco.spigot.display.frame.clearFrames import com.willfp.eco.spigot.display.frame.clearFrames
import com.willfp.eco.spigot.drops.CollatedRunnable import com.willfp.eco.spigot.drops.CollatedRunnable
import com.willfp.eco.spigot.eventlisteners.EntityDeathByEntityListeners import com.willfp.eco.spigot.eventlisteners.EntityDeathByEntityListeners
@@ -46,22 +38,8 @@ import com.willfp.eco.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.spigot.gui.GUIListener import com.willfp.eco.spigot.gui.GUIListener
import com.willfp.eco.spigot.integrations.afk.AFKIntegrationCMI import com.willfp.eco.spigot.integrations.afk.AFKIntegrationCMI
import com.willfp.eco.spigot.integrations.afk.AFKIntegrationEssentials import com.willfp.eco.spigot.integrations.afk.AFKIntegrationEssentials
import com.willfp.eco.spigot.integrations.anticheat.AnticheatAAC import com.willfp.eco.spigot.integrations.anticheat.*
import com.willfp.eco.spigot.integrations.anticheat.AnticheatAlice import com.willfp.eco.spigot.integrations.antigrief.*
import com.willfp.eco.spigot.integrations.anticheat.AnticheatMatrix
import com.willfp.eco.spigot.integrations.anticheat.AnticheatNCP
import com.willfp.eco.spigot.integrations.anticheat.AnticheatSpartan
import com.willfp.eco.spigot.integrations.anticheat.AnticheatVulcan
import com.willfp.eco.spigot.integrations.antigrief.AntigriefBentoBox
import com.willfp.eco.spigot.integrations.antigrief.AntigriefCombatLogXV10
import com.willfp.eco.spigot.integrations.antigrief.AntigriefCombatLogXV11
import com.willfp.eco.spigot.integrations.antigrief.AntigriefFactionsUUID
import com.willfp.eco.spigot.integrations.antigrief.AntigriefGriefPrevention
import com.willfp.eco.spigot.integrations.antigrief.AntigriefKingdoms
import com.willfp.eco.spigot.integrations.antigrief.AntigriefLands
import com.willfp.eco.spigot.integrations.antigrief.AntigriefSuperiorSkyblock2
import com.willfp.eco.spigot.integrations.antigrief.AntigriefTowny
import com.willfp.eco.spigot.integrations.antigrief.AntigriefWorldGuard
import com.willfp.eco.spigot.integrations.customitems.CustomItemsHeadDatabase import com.willfp.eco.spigot.integrations.customitems.CustomItemsHeadDatabase
import com.willfp.eco.spigot.integrations.customitems.CustomItemsItemsAdder import com.willfp.eco.spigot.integrations.customitems.CustomItemsItemsAdder
import com.willfp.eco.spigot.integrations.customitems.CustomItemsOraxen import com.willfp.eco.spigot.integrations.customitems.CustomItemsOraxen
@@ -89,8 +67,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
"com.willfp.eco.proxy", "com.willfp.eco.proxy",
"&a" "&a"
) { ) {
lateinit var dataHandler: DataHandler
init { init {
Items.registerArgParser(EnchantmentArgParser()) Items.registerArgParser(EnchantmentArgParser())
Items.registerArgParser(TextureArgParser()) Items.registerArgParser(TextureArgParser())
@@ -112,9 +88,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
private fun postInit() { private fun postInit() {
Display.setHandler(EcoDisplayHandler(this)) Display.setHandler(EcoDisplayHandler(this))
this.dataHandler = if (this.configYml.getBool("mysql.enabled"))
MySQLDataHandler(this) else YamlDataHandler(this)
} }
override fun handleEnable() { override fun handleEnable() {
@@ -140,29 +113,27 @@ abstract class EcoSpigotPlugin : EcoPlugin(
logger.severe("") logger.severe("")
} }
// Init FIS
this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap() this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap()
} }
override fun handleDisable() { override fun handleDisable() {
this.logger.info("Saving player data...")
val start = System.currentTimeMillis()
Eco.getHandler().playerProfileHandler.save()
this.logger.info("Saved player data! Took ${System.currentTimeMillis() - start}ms")
Eco.getHandler().adventure?.close() Eco.getHandler().adventure?.close()
} }
override fun handleReload() { override fun handleReload() {
CollatedRunnable(this) CollatedRunnable(this)
DropManager.update(this) DropManager.update(this)
ProfileSaver(this)
this.scheduler.runTimer( this.scheduler.runTimer(
{ clearFrames() }, { clearFrames() },
this.configYml.getInt("display-frame-ttl").toLong(), this.configYml.getInt("display-frame-ttl").toLong(),
this.configYml.getInt("display-frame-ttl").toLong() this.configYml.getInt("display-frame-ttl").toLong()
) )
this.scheduler.runTimer(
{
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler)
.autosave(this.configYml.getBool("autosave.async"))
},
this.configYml.getInt("autosave.ticks").toLong(),
this.configYml.getInt("autosave.ticks").toLong()
)
} }
override fun handleAfterLoad() { override fun handleAfterLoad() {
@@ -173,6 +144,8 @@ abstract class EcoSpigotPlugin : EcoPlugin(
override fun loadIntegrationLoaders(): List<IntegrationLoader> { override fun loadIntegrationLoaders(): List<IntegrationLoader> {
return listOf( return listOf(
// AntiGrief // AntiGrief
IntegrationLoader("IridiumSkyblock") { AntigriefManager.register(AntigriefIridiumSkyblock()) },
IntegrationLoader("DeluxeCombat") { AntigriefManager.register(AntigriefDeluxeCombat()) },
IntegrationLoader("SuperiorSkyblock2") { AntigriefManager.register(AntigriefSuperiorSkyblock2()) }, IntegrationLoader("SuperiorSkyblock2") { AntigriefManager.register(AntigriefSuperiorSkyblock2()) },
IntegrationLoader("BentoBox") { AntigriefManager.register(AntigriefBentoBox()) }, IntegrationLoader("BentoBox") { AntigriefManager.register(AntigriefBentoBox()) },
IntegrationLoader("WorldGuard") { AntigriefManager.register(AntigriefWorldGuard()) }, IntegrationLoader("WorldGuard") { AntigriefManager.register(AntigriefWorldGuard()) },

View File

@@ -5,17 +5,23 @@ import com.willfp.eco.util.PlayerUtils
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerLoginEvent
import org.bukkit.event.player.PlayerQuitEvent import org.bukkit.event.player.PlayerQuitEvent
class DataListener : Listener { class DataListener : Listener {
@EventHandler @EventHandler
fun onLeave(event: PlayerQuitEvent) { fun onLeave(event: PlayerQuitEvent) {
PlayerUtils.updateSavedDisplayName(event.player) PlayerUtils.updateSavedDisplayName(event.player)
Eco.getHandler().playerProfileHandler.savePlayer(event.player.uniqueId) Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
} }
@EventHandler @EventHandler
fun onJoin(event: PlayerJoinEvent) { fun onJoin(event: PlayerJoinEvent) {
PlayerUtils.updateSavedDisplayName(event.player) PlayerUtils.updateSavedDisplayName(event.player)
} }
@EventHandler
fun onLogin(event: PlayerLoginEvent) {
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
}
} }

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.spigot.data package com.willfp.eco.spigot.data
import com.willfp.eco.core.Eco
import com.willfp.eco.core.data.keys.KeyRegistry import com.willfp.eco.core.data.keys.KeyRegistry
import com.willfp.eco.core.data.keys.PersistentDataKey import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.core.data.keys.PersistentDataKeyType import com.willfp.eco.core.data.keys.PersistentDataKeyType
@@ -20,7 +21,7 @@ class EcoKeyRegistry(
this.registry[key.key] = key this.registry[key.key] = key
plugin.dataHandler.updateKeys() (Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).updateKeys()
} }
override fun getRegisteredKeys(): MutableSet<PersistentDataKey<*>> { override fun getRegisteredKeys(): MutableSet<PersistentDataKey<*>> {

View File

@@ -1,19 +1,16 @@
package com.willfp.eco.spigot.data package com.willfp.eco.spigot.data
import com.willfp.eco.core.Eco
import com.willfp.eco.core.data.PlayerProfile import com.willfp.eco.core.data.PlayerProfile
import com.willfp.eco.core.data.PlayerProfileHandler import com.willfp.eco.core.data.PlayerProfileHandler
import com.willfp.eco.core.data.keys.PersistentDataKey import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.internal.data.EcoPlayerProfile import com.willfp.eco.internal.data.EcoPlayerProfile
import com.willfp.eco.spigot.EcoSpigotPlugin import com.willfp.eco.spigot.data.storage.DataHandler
import org.bukkit.Bukkit import java.util.UUID
import java.util.*
class EcoPlayerProfileHandler( class EcoPlayerProfileHandler(
private val plugin: EcoSpigotPlugin private val handler: DataHandler
) : PlayerProfileHandler { ) : PlayerProfileHandler {
private val loaded = mutableMapOf<UUID, PlayerProfile>() private val loaded = mutableMapOf<UUID, PlayerProfile>()
private val handler = plugin.dataHandler
override fun load(uuid: UUID): PlayerProfile { override fun load(uuid: UUID): PlayerProfile {
val found = loaded[uuid] val found = loaded[uuid]
@@ -23,61 +20,36 @@ class EcoPlayerProfileHandler(
val data = mutableMapOf<PersistentDataKey<*>, Any>() val data = mutableMapOf<PersistentDataKey<*>, Any>()
for (key in Eco.getHandler().keyRegistry.registeredKeys) { for (key in PersistentDataKey.values()) {
data[key] = handler.read(uuid, key.key) ?: key.defaultValue data[key] = handler.read(uuid, key.key) ?: key.defaultValue
} }
val profile = EcoPlayerProfile(data) val profile = EcoPlayerProfile(data, uuid)
loaded[uuid] = profile loaded[uuid] = profile
return profile return profile
} }
override fun savePlayer(uuid: UUID) { override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
writeToHandler(uuid) val profile = PlayerProfile.load(uuid)
saveToHandler()
}
private fun writeToHandler(uuid: UUID) { for (key in keys) {
val profile = load(uuid) handler.write(uuid, key.key, profile.read(key))
for (key in Eco.getHandler().keyRegistry.registeredKeys) {
handler.write(uuid, key.key, profile.read(key) ?: key.defaultValue)
} }
} }
private fun saveToHandler() { override fun unloadPlayer(uuid: UUID) {
loaded.remove(uuid)
}
override fun saveAll() {
handler.saveAll(loaded.keys.toList())
}
override fun save() {
handler.save() handler.save()
} }
override fun saveAll(async: Boolean) { fun updateKeys() {
val saver = { handler.updateKeys()
for ((uuid, _) in loaded) {
writeToHandler(uuid)
}
saveToHandler()
}
if (async) {
plugin.scheduler.runAsync(saver)
} else {
saver.invoke()
}
}
fun autosave(async: Boolean) {
if (Bukkit.getOnlinePlayers().isEmpty()) {
return
}
if (plugin.configYml.getBool("autosave.log")) {
plugin.logger.info("Auto-Saving player data!")
}
saveAll(async)
if (plugin.configYml.getBool("autosave.log")) {
plugin.logger.info("Saved player data!")
}
} }
} }

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.spigot.data package com.willfp.eco.spigot.data
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.util.NamespacedKeyUtils
import org.bukkit.block.Block import org.bukkit.block.Block
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority

View File

@@ -1,13 +1,25 @@
package com.willfp.eco.spigot.data.storage package com.willfp.eco.spigot.data.storage
import com.willfp.eco.core.data.keys.PersistentDataKey
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import java.util.* import java.util.*
interface DataHandler { interface DataHandler {
fun save() fun save() {
}
fun saveAll(uuids: Iterable<UUID>)
fun updateKeys() {
}
fun savePlayer(uuid: UUID) {
saveKeysForPlayer(uuid, PersistentDataKey.values())
}
fun <T> write(uuid: UUID, key: NamespacedKey, value: T) fun <T> write(uuid: UUID, key: NamespacedKey, value: T)
fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>)
fun <T> read(uuid: UUID, key: NamespacedKey): T? fun <T> read(uuid: UUID, key: NamespacedKey): T?
fun updateKeys()
} }

View File

@@ -1,30 +1,26 @@
package com.willfp.eco.spigot.data.storage package com.willfp.eco.spigot.data.storage
import com.google.common.util.concurrent.ThreadFactoryBuilder
import com.willfp.eco.core.Eco import com.willfp.eco.core.Eco
import com.willfp.eco.core.data.PlayerProfile
import com.willfp.eco.core.data.keys.PersistentDataKey import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.core.data.keys.PersistentDataKeyType import com.willfp.eco.core.data.keys.PersistentDataKeyType
import com.willfp.eco.spigot.EcoSpigotPlugin import com.willfp.eco.spigot.EcoSpigotPlugin
import org.apache.logging.log4j.Level
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import org.jetbrains.exposed.dao.id.UUIDTable import org.jetbrains.exposed.dao.id.UUIDTable
import org.jetbrains.exposed.sql.BooleanColumnType import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.Database
import org.jetbrains.exposed.sql.DoubleColumnType
import org.jetbrains.exposed.sql.IntegerColumnType
import org.jetbrains.exposed.sql.ResultRow
import org.jetbrains.exposed.sql.SchemaUtils
import org.jetbrains.exposed.sql.VarCharColumnType
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.transaction import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update import java.util.*
import java.util.UUID import java.util.concurrent.Executors
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
class MySQLDataHandler( class MySQLDataHandler(
plugin: EcoSpigotPlugin plugin: EcoSpigotPlugin
) : DataHandler { ) : DataHandler {
private val columns = mutableMapOf<String, Column<*>>() private val columns = mutableMapOf<String, Column<*>>()
private val threadFactory = ThreadFactoryBuilder().setNameFormat("eco-mysql-thread-%d").build()
private val executor = Executors.newCachedThreadPool(threadFactory)
init { init {
Database.connect( Database.connect(
@@ -40,6 +36,15 @@ class MySQLDataHandler(
transaction { transaction {
SchemaUtils.create(Players) SchemaUtils.create(Players)
} }
// Get Exposed to shut the hell up
exposedLogger::class.java.getDeclaredField("logger").apply { isAccessible = true }
.apply {
get(exposedLogger).apply {
this.javaClass.getDeclaredMethod("setLevel", Level::class.java)
.invoke(this, Level.OFF)
}
}
} }
override fun updateKeys() { override fun updateKeys() {
@@ -52,17 +57,43 @@ class MySQLDataHandler(
} }
} }
override fun save() { override fun <T> write(uuid: UUID, key: NamespacedKey, value: T) {
// Do nothing getPlayer(uuid)
writeAsserted(uuid, key, value)
} }
override fun <T> write(uuid: UUID, key: NamespacedKey, value: T) { private fun <T> writeAsserted(uuid: UUID, key: NamespacedKey, value: T) {
transaction { val column: Column<T> = getColumn(key.toString()) as Column<T>
getPlayer(uuid)
val column: Column<T> = getColumn(key.toString()) as Column<T>
Players.update({ Players.id eq uuid }) { executor.submit {
it[column] = value transaction {
Players.update({ Players.id eq uuid }) {
it[column] = value
}
}
}
}
override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
savePlayer(uuid, keys)
}
override fun saveAll(uuids: Iterable<UUID>) {
for (uuid in uuids) {
savePlayer(uuid)
}
}
private fun savePlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
val profile = PlayerProfile.load(uuid)
executor.submit {
transaction {
getPlayer(uuid)
for (key in keys) {
writeAsserted(uuid, key.key, profile.read(key))
}
} }
} }
} }
@@ -73,12 +104,11 @@ class MySQLDataHandler(
val player = getPlayer(uuid) val player = getPlayer(uuid)
value = player[getColumn(key.toString())] as T? value = player[getColumn(key.toString())] as T?
} }
return value return value
} }
object Players : UUIDTable("eco_players") { object Players : UUIDTable("eco_players")
}
private fun <T> registerColumn(key: PersistentDataKey<T>, table: UUIDTable) { private fun <T> registerColumn(key: PersistentDataKey<T>, table: UUIDTable) {
table.apply { table.apply {
@@ -112,12 +142,17 @@ class MySQLDataHandler(
} }
private fun getPlayer(uuid: UUID): ResultRow { private fun getPlayer(uuid: UUID): ResultRow {
Players.select { Players.id eq uuid }.firstOrNull() ?: run { val player = transaction {
Players.insert { Players.select { Players.id eq uuid }.limit(1).singleOrNull()
it[id] = uuid
}
} }
return Players.select { Players.id eq uuid }.first() return if (player != null) {
player
} else {
transaction {
Players.insert { it[id] = uuid }
}
getPlayer(uuid)
}
} }
} }

View File

@@ -0,0 +1,16 @@
package com.willfp.eco.spigot.data.storage
import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.internal.data.EcoPlayerProfile
class ProfileSaver(plugin: EcoPlugin) {
init {
plugin.scheduler.runTimer({
for ((uuid, set) in EcoPlayerProfile.CHANGE_MAP) {
Eco.getHandler().playerProfileHandler.saveKeysForPlayer(uuid, set)
}
EcoPlayerProfile.CHANGE_MAP.clear()
}, 1, 1)
}
}

View File

@@ -1,6 +1,8 @@
package com.willfp.eco.spigot.data.storage package com.willfp.eco.spigot.data.storage
import com.willfp.eco.core.config.yaml.YamlBaseConfig import com.willfp.eco.core.config.yaml.YamlBaseConfig
import com.willfp.eco.core.data.PlayerProfile
import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.spigot.EcoSpigotPlugin import com.willfp.eco.spigot.EcoSpigotPlugin
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import java.util.* import java.util.*
@@ -15,8 +17,20 @@ class YamlDataHandler(
dataYml.save() dataYml.save()
} }
override fun updateKeys() { override fun saveAll(uuids: Iterable<UUID>) {
// Do nothing for (uuid in uuids) {
savePlayer(uuid)
}
save()
}
override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
val profile = PlayerProfile.load(uuid)
for (key in keys) {
write(uuid, key.key, profile.read(key))
}
} }
override fun <T> write(uuid: UUID, key: NamespacedKey, value: T) { override fun <T> write(uuid: UUID, key: NamespacedKey, value: T) {

View File

@@ -47,14 +47,8 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
handleRateLimit(player) handleRateLimit(player)
if (usingAsync(player)) { if (usingAsync(player)) {
executor.execute { fun modifyAndSend(itemStacks: MutableList<ItemStack>, windowId: Int, player: Player) {
try { modifyWindowItems(itemStacks, windowId, player)
modifyWindowItems(itemStacks, windowId, player)
} catch (e: Exception) {
if (this.getPlugin().configYml.getBool("async-display.log-errors")) {
this.getPlugin().logger.warning("Error happened in async processing! Disable async display (/plugins/eco/config.yml) if this is a frequent issue")
}
}
val newPacket = packet.deepClone() val newPacket = packet.deepClone()
newPacket.itemListModifier.write(0, itemStacks) newPacket.itemListModifier.write(0, itemStacks)
@@ -63,6 +57,21 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket) ProtocolLibrary.getProtocolManager().sendServerPacket(player, newPacket)
} }
executor.execute {
try {
modifyAndSend(itemStacks, windowId, player)
} catch (e: Exception) {
if (this.getPlugin().configYml.getBool("async-display.log-errors")) {
this.getPlugin().logger.warning("Error happened in async processing! Disable async display (/plugins/eco/config.yml)" +
"if this is a frequent issue. (Remember to disable ratelimit and emergency too)")
}
this.getPlugin().scheduler.run {
modifyAndSend(itemStacks, windowId, player)
}
}
}
} else { } else {
packet.itemListModifier.write(0, modifyWindowItems(itemStacks, windowId, player)) packet.itemListModifier.write(0, modifyWindowItems(itemStacks, windowId, player))
} }
@@ -91,11 +100,12 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
private fun usingAsync(player: Player): Boolean { private fun usingAsync(player: Player): Boolean {
if (this.getPlugin().configYml.getStrings("async-display.disable-on-types", false) if (this.getPlugin().configYml.getStrings("async-display.disable-on-types", false)
.map { it.lowercase() }.contains(player.openInventory.type.name.lowercase())) { .map { it.lowercase() }.contains(player.openInventory.type.name.lowercase())
) {
return false return false
} }
if (this.getPlugin().configYml.getBool("async-display.enabled")) { if (this.getPlugin().configYml.getBool("async-display.always-enabled")) {
return true return true
} }

View File

@@ -0,0 +1,34 @@
package com.willfp.eco.spigot.integrations.antigrief
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
import nl.marido.deluxecombat.api.DeluxeCombatAPI
import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
class AntigriefDeluxeCombat: AntigriefWrapper {
override fun getPluginName(): String {
return "DeluxeCombat"
}
override fun canBreakBlock(player: Player, block: Block): Boolean {
return true
}
override fun canCreateExplosion(player: Player, location: Location): Boolean {
return true
}
override fun canPlaceBlock(player: Player, block: Block): Boolean {
return true
}
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
val api = DeluxeCombatAPI()
return when(victim) {
is Player -> (api.hasProtection(victim) || !api.hasPvPEnabled(victim)) && !api.isInCombat(victim)
else -> true
}
}
}

View File

@@ -0,0 +1,60 @@
package com.willfp.eco.spigot.integrations.antigrief
import com.iridium.iridiumskyblock.PermissionType
import com.iridium.iridiumskyblock.api.IridiumSkyblockAPI
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
import org.bukkit.Location
import org.bukkit.block.Block
import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Player
class AntigriefIridiumSkyblock : AntigriefWrapper {
private val api = IridiumSkyblockAPI.getInstance()
override fun canBreakBlock(
player: Player,
block: Block
): Boolean {
return api.getIslandPermission(api.getIslandViaLocation(block.location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_BREAK)
}
override fun canCreateExplosion(
player: Player,
location: Location
): Boolean {
return api.getIslandPermission(api.getIslandViaLocation(location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_BREAK)
}
override fun canPlaceBlock(
player: Player,
block: Block
): Boolean {
return api.getIslandPermission(api.getIslandViaLocation(block.location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_PLACE)
}
override fun canInjure(
player: Player,
victim: LivingEntity
): Boolean {
return when (victim) {
is Player -> api.getIslandViaLocation(victim.location).orElse(null) != null
else -> api.getIslandPermission(api.getIslandViaLocation(victim.location).orElse(null) ?: return true, api.getUser(player), PermissionType.KILL_MOBS)
}
}
override fun getPluginName(): String {
return "IridiumSkyblock"
}
override fun equals(other: Any?): Boolean {
if (other !is AntigriefWrapper) {
return false
}
return other.pluginName == this.pluginName
}
override fun hashCode(): Int {
return this.pluginName.hashCode()
}
}

View File

@@ -2,10 +2,13 @@ package com.willfp.eco.spigot.integrations.antigrief
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
import me.angeschossen.lands.api.flags.Flags
import me.angeschossen.lands.api.integration.LandsIntegration import me.angeschossen.lands.api.integration.LandsIntegration
import org.bukkit.Location import org.bukkit.Location
import org.bukkit.block.Block import org.bukkit.block.Block
import org.bukkit.entity.Animals
import org.bukkit.entity.LivingEntity import org.bukkit.entity.LivingEntity
import org.bukkit.entity.Monster
import org.bukkit.entity.Player import org.bukkit.entity.Player
class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper { class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
@@ -15,7 +18,7 @@ class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
block: Block block: Block
): Boolean { ): Boolean {
val area = landsIntegration.getAreaByLoc(block.location) ?: return true val area = landsIntegration.getAreaByLoc(block.location) ?: return true
return area.isTrusted(player.uniqueId) return area.hasFlag(player, Flags.BLOCK_BREAK, false)
} }
override fun canCreateExplosion( override fun canCreateExplosion(
@@ -23,7 +26,7 @@ class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
location: Location location: Location
): Boolean { ): Boolean {
val area = landsIntegration.getAreaByLoc(location) ?: return true val area = landsIntegration.getAreaByLoc(location) ?: return true
return area.isTrusted(player.uniqueId) return area.hasFlag(player, Flags.ATTACK_PLAYER, false) && area.hasFlag(player, Flags.ATTACK_ANIMAL, false)
} }
override fun canPlaceBlock( override fun canPlaceBlock(
@@ -31,15 +34,22 @@ class AntigriefLands(private val plugin: EcoPlugin) : AntigriefWrapper {
block: Block block: Block
): Boolean { ): Boolean {
val area = landsIntegration.getAreaByLoc(block.location) ?: return true val area = landsIntegration.getAreaByLoc(block.location) ?: return true
return area.isTrusted(player.uniqueId) return area.hasFlag(player, Flags.BLOCK_PLACE, false)
} }
override fun canInjure( override fun canInjure(
player: Player, player: Player,
victim: LivingEntity victim: LivingEntity
): Boolean { ): Boolean {
val area = landsIntegration.getAreaByLoc(victim.location) ?: return true val area = landsIntegration.getAreaByLoc(victim.location) ?: return true
return area.isTrusted(player.uniqueId)
return when(victim) {
is Player -> area.hasFlag(player, Flags.ATTACK_PLAYER, false)
is Monster -> area.hasFlag(player, Flags.ATTACK_MONSTER, false)
is Animals -> area.hasFlag(player, Flags.ATTACK_MONSTER, false)
else -> area.isTrusted(player.uniqueId)
}
} }
override fun getPluginName(): String { override fun getPluginName(): String {

View File

@@ -11,12 +11,6 @@ mysql:
user: username user: username
password: passy password: passy
autosave:
ticks: 20000 # The amount of ticks between autosaves
log: false # If auto-save messages should be sent to console
async: false # If saves should be performed asynchronously. May cause bugs without MySQL
# Options to fix villager bugs left behind from old (buggy) versions. # Options to fix villager bugs left behind from old (buggy) versions.
villager-display-fix: false villager-display-fix: false
@@ -49,7 +43,7 @@ display-frame-ttl: 17
# are experiencing severe display lag. # are experiencing severe display lag.
async-display: async-display:
# If async display should always be used. # If async display should always be used.
enabled: false always-enabled: false
# Log errors that occur in async processing. # Log errors that occur in async processing.
log-errors: true log-errors: true

View File

@@ -33,6 +33,9 @@ softdepend:
- Essentials - Essentials
- Vault - Vault
- BentoBox - BentoBox
- DeluxeCombat
- IridiumSkyblock
- SuperiorSkyblock2
libraries: libraries:
- 'org.reflections:reflections:0.9.12' - 'org.reflections:reflections:0.9.12'
- 'org.apache.maven:maven-artifact:3.0.3' - 'org.apache.maven:maven-artifact:3.0.3'

View File

@@ -1,2 +1,2 @@
version = 6.13.1 version = 6.13.7
plugin-name = eco plugin-name = eco

BIN
lib/DeluxeCombat API.jar Normal file

Binary file not shown.