Compare commits

..

49 Commits

Author SHA1 Message Date
Auxilor
3ec1183ec3 Javadoc changes 2021-11-13 11:57:46 +00:00
Auxilor
b3e37ea717 Fixed lang.yml 2021-11-13 11:54:51 +00:00
Auxilor
9d0707a4db Merge remote-tracking branch 'origin/master' 2021-11-13 11:51:01 +00:00
Auxilor
41eee84966 Updated to 6.13.8 2021-11-13 11:50:31 +00:00
Auxilor
0f215b48bf Fixed custom items being used in shapeless vanilla recipes 2021-11-13 11:49:51 +00:00
Auxilor
abad973051 PR Codestyle 2021-11-13 11:06:03 +00:00
Auxilor
b385ebff75 Fixed IridiumSkyblock integration 2021-11-13 11:02:42 +00:00
Auxilor
f924d23feb Merge remote-tracking branch 'origin/master' into develop 2021-11-13 11:00:34 +00:00
Will FP
d603476201 Merge pull request #53
Fixed DeluxeCombat integration
2021-11-13 11:00:28 +00:00
Auxilor
b911bbce87 Updated Config string getters for more explicit formatting options 2021-11-13 11:00:08 +00:00
_OfTeN_
d2676c2af1 Fixed DeluxeCombat integration 2021-11-13 10:41:59 +03:00
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
90 changed files with 1416 additions and 739 deletions

View File

@@ -5,20 +5,17 @@
- The pull request must not have any checkstyle issues.
- Every method and field must have a javadoc attached.
2. Use lombok wherever possible.
- @Getter, @Setter, @UtilityClass only.
3. Use JetBrains annotations
2. Use JetBrains annotations
- Every parameter should be annotated with @NotNull or @Nullable
- Use @NotNull over lombok @NonNull
4. Imports
3. Imports
- No group (*) imports.
- No static imports.
## 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.
- 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">
<br>
<img src="https://i.imgur.com/kU3ejCt.png" alt="eco logo" width="256">
<br>
</h1>
# eco
eco is a powerful Spigot development library that simplifies the process of plugin creation and supercharges
your plugins.
It's the engine behind [EcoEnchants](https://polymart.org/resource/490), [Reforges](https://polymart.org/resource/1330),
[EcoItems](https://polymart.org/resource/1247), [EcoSkills](https://polymart.org/resource/1351),
[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/)
- Supports 1.16.5+
### bStats
<img src="https://bstats.org/signatures/bukkit/eco.svg" width="512">
# Information for development
# For developers
## 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
@@ -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:
@@ -71,7 +86,7 @@ Maven:
</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:
@@ -84,85 +99,21 @@ cd eco
./gradlew build
```
# Features
Here's a list of some (not all) of the features of eco:
- Command system with subcommands
- Reworked config system
- JSON Config Support
- Client-Side item display
- World drop system
- Event manager
- PlayerJumpEvent
- ArmorEquipEvent
- EntityDeathByEntityEvent
- NaturalExpGainEvent
- Plugin extensions (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
*Click here to read [the entire license](https://github.com/Auxilor/eco/blob/master/LICENSE.md).*
<h1 align="center">
Check out our partners!
<br>
<div style="width: 50%; margin: 0 auto;">
<br>
<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 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>
<br>
</div>
</h1>

View File

@@ -57,20 +57,11 @@ allprojects {
// IridiumSkyblock
maven { url 'https://nexus.iridiumdevelopment.net/repository/maven-releases/' }
// Velocity
maven { url 'https://repo.velocitypowered.com/snapshots/' }
}
dependencies {
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
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.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.PacketContainer;
import com.comphenix.protocol.events.PacketEvent;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -26,7 +25,6 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
* <p>
* Useful for monitor priority adapters that <b>must</b> be ran last.
*/
@Getter
private final boolean postLoad;
/**
@@ -134,4 +132,13 @@ public abstract class AbstractPacketAdapter extends PacketAdapter {
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;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import org.jetbrains.annotations.NotNull;
*
* @see Handler
*/
@UtilityClass
public class Eco {
public final class Eco {
/**
* Instance of eco handler.
*/
@ApiStatus.Internal
private Handler handler;
private static Handler handler;
/**
* Set the handler.
* @param handler The handler.
*/
@ApiStatus.Internal
public void setHandler(@NotNull final Handler handler) {
public static void setHandler(@NotNull final Handler handler) {
Validate.isTrue(Eco.handler == null, "Already initialized!");
Eco.handler = handler;
@@ -46,7 +44,11 @@ public class Eco {
* @return The handler.
*/
@ApiStatus.Internal
public Handler getHandler() {
public static Handler getHandler() {
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.DisplayModule;
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.factory.MetadataValueFactory;
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.scheduling.Scheduler;
import com.willfp.eco.core.web.UpdateChecker;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.bukkit.Bukkit;
@@ -56,73 +56,61 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
/**
* The polymart resource ID of the plugin.
*/
@Getter
private final int resourceId;
/**
* The bStats resource ID of the plugin.
*/
@Getter
private final int bStatsId;
/**
* The package where proxy implementations are.
*/
@Getter
private final String proxyPackage;
/**
* The color of the plugin, used in messages.
*/
@Getter
private final String color;
/**
* Loaded integrations.
*/
@Getter
private final Set<String> loadedIntegrations = new HashSet<>();
/**
* The internal plugin scheduler.
*/
@Getter
private final Scheduler scheduler;
/**
* The internal plugin Event Manager.
*/
@Getter
private final EventManager eventManager;
/**
* Config.yml.
*/
@Getter
private final ConfigYml configYml;
/**
* Lang.yml.
*/
@Getter
private final LangYml langYml;
/**
* The internal factory to produce {@link org.bukkit.NamespacedKey}s.
*/
@Getter
private final NamespacedKeyFactory namespacedKeyFactory;
/**
* The internal factory to produce {@link org.bukkit.metadata.FixedMetadataValue}s.
*/
@Getter
private final MetadataValueFactory metadataValueFactory;
/**
* The internal factory to produce {@link com.willfp.eco.core.scheduling.RunnableTask}s.
*/
@Getter
private final RunnableFactory runnableFactory;
/**
@@ -130,19 +118,16 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
*
* @see com.willfp.eco.core.extensions.Extension
*/
@Getter
private final ExtensionLoader extensionLoader;
/**
* The handler class for updatable classes.
*/
@Getter
private final ConfigHandler configHandler;
/**
* The display module for the plugin.
*/
@Getter
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.
*/
@Getter
private boolean outdated = false;
/**
* If the plugin supports extensions.
*/
@Getter
private final boolean supportingExtensions;
/**
* The proxy factory.
*/
@Getter
@Nullable
private final ProxyFactory proxyFactory;
/**
@@ -469,6 +452,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
this.reload();
for (Extension extension : this.getExtensionLoader().getLoadedExtensions()) {
extension.handleAfterLoad();
}
this.getLogger().info("Loaded " + this.color + this.getName());
}
@@ -483,6 +470,10 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
this.getScheduler().cancelAll();
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() {
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;
import lombok.AccessLevel;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
/**
@@ -13,7 +11,6 @@ public abstract class PluginDependent<T extends EcoPlugin> {
/**
* The {@link EcoPlugin} that is stored.
*/
@Getter(AccessLevel.PROTECTED)
@NotNull
private final T plugin;
@@ -25,4 +22,14 @@ public abstract class PluginDependent<T extends EcoPlugin> {
protected PluginDependent(@NotNull final T plugin) {
this.plugin = plugin;
}
/**
* Get the plugin.
*
* @return The plugin.
*/
@NotNull
protected T getPlugin() {
return this.plugin;
}
}

View File

@@ -3,7 +3,6 @@ package com.willfp.eco.core;
import com.willfp.eco.core.integrations.economy.EconomyManager;
import com.willfp.eco.core.proxy.ProxyConstants;
import com.willfp.eco.util.ClassUtils;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
@@ -69,7 +68,6 @@ public class Prerequisite {
/**
* If the necessary prerequisite condition has been met.
*/
@Getter
private boolean isMet;
/**
@@ -80,7 +78,6 @@ public class Prerequisite {
/**
* The description of the requirements of the prerequisite.
*/
@Getter
private final String description;
/**
@@ -125,4 +122,22 @@ public class Prerequisite {
static {
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.CommandHandler;
import com.willfp.eco.core.command.TabCompleteHandler;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil;
@@ -30,7 +27,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
/**
* The name of the command.
*/
@Getter
private final String name;
/**
@@ -38,7 +34,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
* <p>
* Written out as a string for flexibility with subclasses.
*/
@Getter
private final String permission;
/**
@@ -46,27 +41,23 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
* <p>
* In other worlds, only allowed to be executed by console.
*/
@Getter
private final boolean playersOnly;
/**
* The actual code to be executed in the command.
*/
@Getter
@Setter
private CommandHandler handler = (sender, args) -> { };
private CommandHandler handler = (sender, args) -> {
// Do nothing by default
};
/**
* The tab completion code to be executed in the command.
*/
@Getter
@Setter
private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>();
/**
* All subcommands for the command.
*/
@Getter(AccessLevel.PROTECTED)
private final List<CommandBase> subcommands;
/**
@@ -202,4 +193,76 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
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

@@ -24,7 +24,7 @@ public class LangYml extends YamlBaseConfig {
* @return The prefix.
*/
public String getPrefix() {
return this.getString("messages.prefix");
return this.getFormattedString("messages.prefix");
}
/**
@@ -33,7 +33,7 @@ public class LangYml extends YamlBaseConfig {
* @return The message.
*/
public String getNoPermission() {
return getPrefix() + this.getString("messages.no-permission");
return getPrefix() + this.getFormattedString("messages.no-permission");
}
/**
@@ -55,6 +55,6 @@ public class LangYml extends YamlBaseConfig {
*/
public String getMessage(@NotNull final String message,
@NotNull final StringUtils.FormatOption option) {
return getPrefix() + this.getString("messages." + message, option);
return getPrefix() + this.getFormattedString("messages." + message, option);
}
}

View File

@@ -11,6 +11,7 @@ import java.util.List;
* <p>
* Contains all methods that must exist in yaml and json configurations.
*/
@SuppressWarnings("unused")
public interface Config extends Cloneable {
/**
* Clears cache.
@@ -159,8 +160,34 @@ public interface Config extends Cloneable {
@Nullable
List<Boolean> getBoolsOrNull(@NotNull String path);
/**
* Get a formatted string from config.
*
* @param path The key to fetch the value from.
* @return The found value, or an empty string if not found.
*/
@NotNull
default String getFormattedString(@NotNull String path) {
return getString(path, true);
}
/**
* Get a formatted string from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or an empty string if not found.
*/
@NotNull
default String getFormattedString(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getString(path, true, option);
}
/**
* Get a string from config.
* <p>
* Formatted by default.
*
* @param path The key to fetch the value from.
* @return The found value, or an empty string if not found.
@@ -172,12 +199,13 @@ public interface Config extends Cloneable {
/**
* Get a string from config.
* <p>
* This will be deprecated when {@link Config#getString(String)} no longer formats by default.
*
* @param path The key to fetch the value from.
* @param format If the string should be formatted.
* @return The found value, or an empty string if not found.
*/
@NotNull
default String getString(@NotNull String path,
boolean format) {
return this.getString(path, format, StringUtils.FormatOption.WITH_PLACEHOLDERS);
@@ -189,8 +217,10 @@ public interface Config extends Cloneable {
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or an empty string if not found.
* @deprecated Use {@link Config#getFormattedString(String, StringUtils.FormatOption)} instead.
*/
@NotNull
@Deprecated
default String getString(@NotNull String path,
@NotNull final StringUtils.FormatOption option) {
return this.getString(path, true, option);
@@ -209,8 +239,34 @@ public interface Config extends Cloneable {
boolean format,
@NotNull StringUtils.FormatOption option);
/**
* Get a formatted string from config.
*
* @param path The key to fetch the value from.
* @return The found value, or an empty string if not found.
*/
@Nullable
default String getFormattedStringOrNull(@NotNull String path) {
return getStringOrNull(path, true);
}
/**
* Get a formatted string from config.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or an empty string if not found.
*/
@Nullable
default String getFormattedStringOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStringOrNull(path, true, option);
}
/**
* Get a string from config.
* <p>
* Formatted by default.
*
* @param path The key to fetch the value from.
* @return The found value, or null if not found.
@@ -222,6 +278,8 @@ public interface Config extends Cloneable {
/**
* Get a string from config.
* <p>
* This will be deprecated when {@link Config#getStringOrNull(String)} no longer formats by default.
*
* @param path The key to fetch the value from.
* @param format If the string should be formatted.
@@ -239,8 +297,10 @@ public interface Config extends Cloneable {
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or null if not found.
* @deprecated Use {@link Config#getFormattedString(String, StringUtils.FormatOption)} instead.
*/
@Nullable
@Deprecated
default String getStringOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return this.getStringOrNull(path, true, option);
@@ -251,7 +311,7 @@ public interface Config extends Cloneable {
*
* @param path The key to fetch the value from.
* @param format If the string should be formatted.
* @param option The format option.
* @param option The format option. If format is false, this will be ignored.
* @return The found value, or null if not found.
*/
@Nullable
@@ -268,12 +328,44 @@ public interface Config extends Cloneable {
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/
@NotNull
default List<String> getFormattedStrings(@NotNull String path) {
return getStrings(path, true, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a list of strings from config.
* <p>
* Formatted by default.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/
@NotNull
default List<String> getFormattedStrings(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStrings(path, true, option);
}
/**
* Get a list of strings from config.
* <p>
* Formatted by default.
* <p>
* This will be changed in newer versions to <b>not</b> format by default.
*
* @param path The key to fetch the value from.
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
*/
@NotNull
default List<String> getStrings(@NotNull String path) {
return getStrings(path, true);
}
/**
* Get a list of strings from config.
* <p>
* This will be deprecated when {@link Config#getStrings(String)} no longer formats by default.
*
* @param path The key to fetch the value from.
* @param format If the strings should be formatted.
@@ -291,8 +383,10 @@ public interface Config extends Cloneable {
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or a blank {@link java.util.ArrayList} if not found.
* @deprecated Use {@link Config#getFormattedStrings(String, StringUtils.FormatOption)} instead.
*/
@Nullable
@NotNull
@Deprecated
default List<String> getStrings(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStrings(path, true, option);
@@ -313,6 +407,38 @@ public interface Config extends Cloneable {
/**
* Get a list of strings from config.
* <p>
* Formatted by default.
*
* @param path The key to fetch the value from.
* @return The found value, or null if not found.
*/
@Nullable
default List<String> getFormattedStringsOrNull(@NotNull String path) {
return getStringsOrNull(path, true, StringUtils.FormatOption.WITH_PLACEHOLDERS);
}
/**
* Get a list of strings from config.
* <p>
* Formatted by default.
*
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or null if not found.
*/
@Nullable
default List<String> getFormattedStringsOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStringsOrNull(path, true, option);
}
/**
* Get a list of strings from config.
* <p>
* Formatted by default.
* <p>
* This will be changed in newer versions to <b>not</b> format by default.
*
* @param path The key to fetch the value from.
* @return The found value, or null if not found.
@@ -341,8 +467,10 @@ public interface Config extends Cloneable {
* @param path The key to fetch the value from.
* @param option The format option.
* @return The found value, or null if not found.
* @deprecated Use {@link Config#getFormattedStringsOrNull(String, StringUtils.FormatOption)} instead.
*/
@Nullable
@Deprecated
default List<String> getStringsOrNull(@NotNull String path,
@NotNull StringUtils.FormatOption option) {
return getStringsOrNull(path, true, option);

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.util.StringUtils;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -27,7 +26,6 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
* <p>
* In general use, though, the handle isn't necessary.
*/
@Getter
private final T handle;
/**
@@ -179,4 +177,13 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
public Config 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);
}
@Override
public YamlConfiguration getBukkitHandle() {
return ((WrappedYamlConfiguration) this.getHandle()).getBukkitHandle();

View File

@@ -1,7 +1,9 @@
package com.willfp.eco.core.data;
import com.willfp.eco.core.data.keys.PersistentDataKey;
import org.jetbrains.annotations.NotNull;
import java.util.Set;
import java.util.UUID;
/**
@@ -17,11 +19,37 @@ public interface PlayerProfileHandler {
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.
*/
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.
@@ -36,6 +64,15 @@ public interface PlayerProfileHandler {
/**
* 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,7 +1,6 @@
package com.willfp.eco.core.data.keys;
import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull;
@@ -16,19 +15,16 @@ public class PersistentDataKey<T> {
/**
* The key of the persistent data value.
*/
@Getter
private final NamespacedKey key;
/**
* The default value for the key.
*/
@Getter
private final T defaultValue;
/**
* The persistent data key type.
*/
@Getter
private final PersistentDataKeyType type;
/**
@@ -65,4 +61,31 @@ public class PersistentDataKey<T> {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.ApiStatus;
@@ -10,8 +9,7 @@ import org.jetbrains.annotations.Nullable;
/**
* Utility class to manage client-side item display.
*/
@UtilityClass
public class Display {
public final class Display {
/**
* The prefix for client-side lore lines.
*/
@@ -28,7 +26,7 @@ public class Display {
* @param itemStack The item.
* @return The ItemStack.
*/
public ItemStack display(@NotNull final ItemStack itemStack) {
public static ItemStack display(@NotNull final ItemStack itemStack) {
return display(itemStack, null);
}
@@ -39,8 +37,8 @@ public class Display {
* @param player The player.
* @return The ItemStack.
*/
public ItemStack display(@NotNull final ItemStack itemStack,
@Nullable final Player player) {
public static ItemStack display(@NotNull final ItemStack itemStack,
@Nullable final Player player) {
return handler.display(itemStack, player);
}
@@ -50,7 +48,7 @@ public class Display {
* @param itemStack The item.
* @return The ItemStack.
*/
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack) {
return finalize(display(itemStack, null));
}
@@ -61,7 +59,7 @@ public class Display {
* @param player The player.
* @return The ItemStack.
*/
public ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
@Nullable final Player player) {
return finalize(display(itemStack, player));
}
@@ -72,7 +70,7 @@ public class Display {
* @param itemStack The item.
* @return The ItemStack.
*/
public ItemStack revert(@NotNull final ItemStack itemStack) {
public static ItemStack revert(@NotNull final ItemStack itemStack) {
return handler.revert(itemStack);
}
@@ -82,7 +80,7 @@ public class Display {
* @param itemStack The item.
* @return The ItemStack.
*/
public ItemStack finalize(@NotNull final ItemStack itemStack) {
public static ItemStack finalize(@NotNull final ItemStack itemStack) {
return handler.finalize(itemStack);
}
@@ -92,7 +90,7 @@ public class Display {
* @param itemStack The item.
* @return The ItemStack.
*/
public ItemStack unfinalize(@NotNull final ItemStack itemStack) {
public static ItemStack unfinalize(@NotNull final ItemStack itemStack) {
return handler.unfinalize(itemStack);
}
@@ -102,7 +100,7 @@ public class Display {
* @param itemStack The item.
* @return If finalized.
*/
public boolean isFinalized(@NotNull final ItemStack itemStack) {
public static boolean isFinalized(@NotNull final ItemStack itemStack) {
return handler.isFinalized(itemStack);
}
@@ -111,7 +109,7 @@ public class Display {
*
* @param module The module.
*/
public void registerDisplayModule(@NotNull final DisplayModule module) {
public static void registerDisplayModule(@NotNull final DisplayModule module) {
handler.registerDisplayModule(module);
}
@@ -176,4 +174,8 @@ public class Display {
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.PluginDependent;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -15,7 +14,6 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
/**
* The priority of the module.
*/
@Getter
private final DisplayPriority priority;
/**
@@ -81,4 +79,13 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
public final String getPluginName() {
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;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.event.HandlerList;
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.
*/
@Getter
private final List<ItemStack> before;
/**
* The armor contents after. 0 is helmet, 3 is boots.
*/
@Getter
private final List<ItemStack> after;
/**
@@ -37,7 +34,7 @@ public class ArmorChangeEvent extends PlayerEvent {
*
* @param player The player.
* @param before The armor contents before.
* @param after The armor contents after.
* @param after The armor contents after.
*/
public ArmorChangeEvent(@NotNull final Player player,
@NotNull final List<ItemStack> before,
@@ -52,7 +49,6 @@ public class ArmorChangeEvent extends PlayerEvent {
*
* @return A list of handlers handling this event.
*/
@Override
@NotNull
public HandlerList getHandlers() {
@@ -67,4 +63,22 @@ public class ArmorChangeEvent extends PlayerEvent {
public static HandlerList getHandlerList() {
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;
import lombok.Getter;
import org.bukkit.entity.Entity;
import org.bukkit.entity.LivingEntity;
import org.bukkit.event.Event;
@@ -25,31 +24,26 @@ public class EntityDeathByEntityEvent extends Event {
/**
* The {@link LivingEntity} killed.
*/
@Getter
private final LivingEntity victim;
/**
* The {@link Entity} that killed.
*/
@Getter
private final Entity killer;
/**
* The associated {@link EntityDeathEvent}.
*/
@Getter
private final EntityDeathEvent deathEvent;
/**
* The entity drops.
*/
@Getter
private final List<ItemStack> drops;
/**
* The xp to drop.
*/
@Getter
private final int xp;
/**
@@ -91,4 +85,49 @@ public class EntityDeathByEntityEvent extends Event {
public static HandlerList getHandlerList() {
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;
import lombok.Getter;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerExpChangeEvent;
@@ -20,7 +19,6 @@ public class NaturalExpGainEvent extends Event {
* The associated {@link PlayerExpChangeEvent}.
* Use this to modify event parameters.
*/
@Getter
private final PlayerExpChangeEvent expChangeEvent;
/**
@@ -50,4 +48,13 @@ public class NaturalExpGainEvent extends Event {
public static HandlerList getHandlerList() {
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.PluginLike;
import com.willfp.eco.core.config.updating.ConfigHandler;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull;
@@ -25,7 +23,6 @@ public abstract class Extension implements PluginLike {
/**
* The {@link EcoPlugin} that this extension is for.
*/
@Getter(AccessLevel.PROTECTED)
private final EcoPlugin plugin;
/**
@@ -57,6 +54,20 @@ public abstract class Extension implements PluginLike {
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.
*/
@@ -67,6 +78,20 @@ public abstract class Extension implements PluginLike {
*/
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.
* <p>
@@ -117,4 +142,13 @@ public abstract class Extension implements PluginLike {
public ConfigHandler 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.util.ListUtils;
import lombok.Getter;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -29,7 +28,6 @@ public class FillerMask {
/**
* Mask.
*/
@Getter
private final List<List<Slot>> mask;
/**
@@ -47,7 +45,7 @@ public class FillerMask {
* Create a new filler mask.
*
* @param materials The mask materials.
* @param pattern The pattern.
* @param pattern The pattern.
*/
public FillerMask(@NotNull final MaskMaterials materials,
@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;
import lombok.Getter;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -14,7 +13,6 @@ public class FillerSlot implements Slot {
/**
* The ItemStack.
*/
@Getter
private final ItemStack itemStack;
/**
@@ -35,4 +33,13 @@ public class FillerSlot implements Slot {
public boolean isCaptive() {
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;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
/**
@@ -17,7 +16,6 @@ public class IntegrationLoader {
/**
* The plugin to require to load the integration.
*/
@Getter
private final String pluginName;
/**
@@ -38,4 +36,13 @@ public class IntegrationLoader {
public void load() {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import java.util.Set;
/**
* Class to handle afk integrations.
*/
@UtilityClass
public class AFKManager {
public final class AFKManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final AFKWrapper integration) {
registered.add(integration);
public static void register(@NotNull final AFKWrapper integration) {
REGISTERED.add(integration);
}
/**
@@ -32,8 +30,8 @@ public class AFKManager {
* @param player The player.
* @return If afk.
*/
public boolean isAfk(@NotNull final Player player) {
for (AFKWrapper afkWrapper : registered) {
public static boolean isAfk(@NotNull final Player player) {
for (AFKWrapper afkWrapper : REGISTERED) {
if (afkWrapper.isAfk(player)) {
return true;
}
@@ -41,4 +39,8 @@ public class AFKManager {
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;
import com.willfp.eco.core.EcoPlugin;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player;
import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
@@ -12,12 +11,11 @@ import java.util.Set;
/**
* Class to handle anticheat integrations.
*/
@UtilityClass
public class AnticheatManager {
public final class AnticheatManager {
/**
* 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.
@@ -25,12 +23,12 @@ public class AnticheatManager {
* @param plugin The plugin.
* @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) {
if (anticheat instanceof Listener) {
plugin.getEventManager().registerListener((Listener) anticheat);
}
anticheats.add(anticheat);
ANTICHEATS.add(anticheat);
}
/**
@@ -38,8 +36,8 @@ public class AnticheatManager {
*
* @param player The player to exempt.
*/
public void exemptPlayer(@NotNull final Player player) {
anticheats.forEach(anticheat -> anticheat.exempt(player));
public static void exemptPlayer(@NotNull final Player player) {
ANTICHEATS.forEach(anticheat -> anticheat.exempt(player));
}
/**
@@ -48,7 +46,11 @@ public class AnticheatManager {
*
* @param player The player to remove the exemption.
*/
public void unexemptPlayer(@NotNull final Player player) {
anticheats.forEach(anticheat -> anticheat.unexempt(player));
public static void unexemptPlayer(@NotNull final Player 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;
import lombok.experimental.UtilityClass;
import org.bukkit.Location;
import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity;
@@ -13,20 +12,19 @@ import java.util.Set;
/**
* Class to handle antigrief integrations.
*/
@UtilityClass
public class AntigriefManager {
public final class AntigriefManager {
/**
* Registered antigriefs.
*/
private final Set<AntigriefWrapper> registered = new HashSet<>();
private static final Set<AntigriefWrapper> REGISTERED = new HashSet<>();
/**
* Register a new AntiGrief/Land Management integration.
*
* @param antigrief The integration to register.
*/
public void register(@NotNull final AntigriefWrapper antigrief) {
registered.add(antigrief);
public static void register(@NotNull final AntigriefWrapper antigrief) {
REGISTERED.add(antigrief);
}
/**
@@ -34,9 +32,9 @@ public class AntigriefManager {
*
* @param antigrief The integration to unregister.
*/
public void unregister(@NotNull final AntigriefWrapper antigrief) {
registered.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
registered.remove(antigrief);
public static void unregister(@NotNull final AntigriefWrapper antigrief) {
REGISTERED.removeIf(it -> it.getPluginName().equalsIgnoreCase(antigrief.getPluginName()));
REGISTERED.remove(antigrief);
}
/**
@@ -46,9 +44,9 @@ public class AntigriefManager {
* @param block The 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) {
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.
* @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) {
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.
* @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) {
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.
* @return If player can injure.
*/
public boolean canInjure(@NotNull final Player player,
public static boolean canInjure(@NotNull final Player player,
@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

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.customitems;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
@@ -9,20 +8,19 @@ import java.util.Set;
/**
* Class to handle custom item integrations.
*/
@UtilityClass
public class CustomItemsManager {
public final class CustomItemsManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final CustomItemsWrapper integration) {
registered.add(integration);
public static void register(@NotNull final CustomItemsWrapper integration) {
REGISTERED.add(integration);
}
/**
@@ -30,9 +28,13 @@ public class CustomItemsManager {
*
* @see com.willfp.eco.core.items.Items
*/
public void registerAllItems() {
for (CustomItemsWrapper customItemsWrapper : registered) {
public static void registerAllItems() {
for (CustomItemsWrapper customItemsWrapper : REGISTERED) {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.OfflinePlayer;
import org.jetbrains.annotations.NotNull;
@@ -10,20 +9,19 @@ import java.util.Set;
/**
* Class to handle economy.
*/
@UtilityClass
public class EconomyManager {
public final class EconomyManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final EconomyWrapper integration) {
registered.add(integration);
public static void register(@NotNull final EconomyWrapper integration) {
REGISTERED.add(integration);
}
/**
@@ -31,8 +29,8 @@ public class EconomyManager {
*
* @return If any economy.
*/
public boolean hasRegistrations() {
return !registered.isEmpty();
public static boolean hasRegistrations() {
return !REGISTERED.isEmpty();
}
/**
@@ -42,9 +40,9 @@ public class EconomyManager {
* @param amount 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) {
for (EconomyWrapper wrapper : registered) {
for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.hasAmount(player, amount);
}
@@ -58,9 +56,9 @@ public class EconomyManager {
* @param amount The amount to give.
* @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) {
for (EconomyWrapper wrapper : registered) {
for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.giveMoney(player, amount);
}
@@ -74,9 +72,9 @@ public class EconomyManager {
* @param amount The amount to remove.
* @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) {
for (EconomyWrapper wrapper : registered) {
for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.removeMoney(player, amount);
}
@@ -89,11 +87,15 @@ public class EconomyManager {
* @param player The player.
* @return The balance.
*/
public double getBalance(@NotNull final OfflinePlayer player) {
for (EconomyWrapper wrapper : registered) {
public static double getBalance(@NotNull final OfflinePlayer player) {
for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.getBalance(player);
}
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;
import lombok.experimental.UtilityClass;
import org.bukkit.Location;
import org.jetbrains.annotations.NotNull;
@@ -11,20 +10,19 @@ import java.util.Set;
/**
* Class to handle hologram integrations.
*/
@UtilityClass
public class HologramManager {
public final class HologramManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final HologramWrapper integration) {
registered.add(integration);
public static void register(@NotNull final HologramWrapper integration) {
REGISTERED.add(integration);
}
/**
@@ -34,12 +32,16 @@ public class HologramManager {
* @param contents The contents for 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) {
for (HologramWrapper wrapper : registered) {
for (HologramWrapper wrapper : REGISTERED) {
return wrapper.createHologram(location, contents);
}
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;
import lombok.experimental.UtilityClass;
import org.bukkit.block.Block;
import org.bukkit.event.Event;
import org.jetbrains.annotations.NotNull;
@@ -11,20 +10,19 @@ import java.util.Set;
/**
* Class to handle mcmmo integrations.
*/
@UtilityClass
public class McmmoManager {
public final class McmmoManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final McmmoWrapper integration) {
registered.add(integration);
public static void register(@NotNull final McmmoWrapper integration) {
REGISTERED.add(integration);
}
/**
@@ -33,8 +31,8 @@ public class McmmoManager {
* @param block The block.
* @return The bonus drop count.
*/
public int getBonusDropCount(@NotNull final Block block) {
for (McmmoWrapper mcmmoWrapper : registered) {
public static int getBonusDropCount(@NotNull final Block block) {
for (McmmoWrapper mcmmoWrapper : REGISTERED) {
return mcmmoWrapper.getBonusDropCount(block);
}
return 0;
@@ -46,10 +44,14 @@ public class McmmoManager {
* @param event The event to check.
* @return If the event is fake.
*/
public boolean isFake(@NotNull final Event event) {
for (McmmoWrapper mcmmoWrapper : registered) {
public static boolean isFake(@NotNull final Event event) {
for (McmmoWrapper mcmmoWrapper : REGISTERED) {
return mcmmoWrapper.isFake(event);
}
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;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
@@ -17,7 +16,6 @@ public class PlaceholderEntry {
/**
* The name of the placeholder, used in lookups.
*/
@Getter
private final String identifier;
/**
@@ -78,6 +76,15 @@ public class PlaceholderEntry {
return requiresPlayer;
}
/**
* Get the identifier.
*
* @return The identifier.
*/
public String getIdentifier() {
return identifier;
}
/**
* Register the placeholder.
*/

View File

@@ -1,6 +1,5 @@
package com.willfp.eco.core.integrations.placeholder;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -13,8 +12,7 @@ import java.util.Set;
/**
* Class to handle placeholder integrations.
*/
@UtilityClass
public class PlaceholderManager {
public final class PlaceholderManager {
/**
* All registered placeholders.
*/
@@ -81,4 +79,8 @@ public class PlaceholderManager {
}
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;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import java.util.HashSet;
@@ -9,28 +8,31 @@ import java.util.Set;
/**
* Class to handle shop integrations.
*/
@UtilityClass
public class ShopManager {
public final class ShopManager {
/**
* 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.
*
* @param integration The integration to register.
*/
public void register(@NotNull final ShopWrapper integration) {
registered.add(integration);
public static void register(@NotNull final ShopWrapper integration) {
REGISTERED.add(integration);
}
/**
* Register eco item provider for shop plugins.
*/
public void registerEcoProvider() {
for (ShopWrapper shopWrapper : registered) {
public static void registerEcoProvider() {
for (ShopWrapper shopWrapper : REGISTERED) {
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;
import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
@@ -23,7 +22,6 @@ public class CustomItem implements TestableItem {
/**
* The key.
*/
@Getter
private final NamespacedKey key;
/**
@@ -77,4 +75,13 @@ public class CustomItem implements TestableItem {
public void register() {
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.util.NamespacedKeyUtils;
import com.willfp.eco.util.NumberUtils;
import lombok.experimental.UtilityClass;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
@@ -28,7 +27,6 @@ import java.util.stream.Collectors;
/**
* Class to manage all custom and vanilla items.
*/
@UtilityClass
public final class Items {
/**
* All recipe parts.
@@ -51,7 +49,7 @@ public final class Items {
* @param key The key of 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) {
REGISTRY.put(key, item);
}
@@ -61,7 +59,7 @@ public final class Items {
*
* @param provider The provider.
*/
public void registerItemProvider(@NotNull final ItemProvider provider) {
public static void registerItemProvider(@NotNull final ItemProvider provider) {
PROVIDERS.put(provider.getNamespace(), provider);
}
@@ -70,7 +68,7 @@ public final class Items {
*
* @param parser The parser.
*/
public void registerArgParser(@NotNull final LookupArgParser parser) {
public static void registerArgParser(@NotNull final LookupArgParser parser) {
ARG_PARSERS.add(parser);
}
@@ -79,7 +77,7 @@ public final class Items {
*
* @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);
}
@@ -106,7 +104,7 @@ public final class Items {
* @param key The lookup string.
* @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("?")) {
String[] options = key.split("\\?");
for (String option : options) {
@@ -243,7 +241,7 @@ public final class Items {
* @param itemStack The itemStack to check.
* @return If is recipe.
*/
public boolean isCustomItem(@NotNull final ItemStack itemStack) {
public static boolean isCustomItem(@NotNull final ItemStack itemStack) {
for (TestableItem item : REGISTRY.values()) {
if (item.matches(itemStack)) {
return true;
@@ -259,7 +257,7 @@ public final class Items {
* @return The custom item, or null if not exists.
*/
@Nullable
public CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
public static CustomItem getCustomItem(@NotNull final ItemStack itemStack) {
for (TestableItem item : REGISTRY.values()) {
if (item.matches(itemStack)) {
return getOrWrap(item);
@@ -273,7 +271,7 @@ public final class 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());
}
@@ -286,7 +284,7 @@ public final class Items {
* @param item The item.
* @return The CustomItem.
*/
public CustomItem getOrWrap(@NotNull final TestableItem item) {
public static CustomItem getOrWrap(@NotNull final TestableItem item) {
if (item instanceof CustomItem) {
return (CustomItem) item;
} 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;
import com.willfp.eco.util.StringUtils;
import lombok.AccessLevel;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.NamespacedKey;
@@ -29,13 +27,11 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
/**
* The ItemMeta used while building.
*/
@Getter(AccessLevel.PROTECTED)
private final T meta;
/**
* The ItemStack.
*/
@Getter(AccessLevel.PROTECTED)
private final ItemStack base;
/**
@@ -201,4 +197,22 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
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;
import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -17,7 +16,6 @@ public abstract class ItemProvider {
/**
* The namespace.
*/
@Getter
private final String namespace;
/**
@@ -37,4 +35,13 @@ public abstract class ItemProvider {
*/
@Nullable
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;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit;
/**
* Proxy / NMS constants.
*/
@UtilityClass
public class ProxyConstants {
public final class ProxyConstants {
/**
* The NMS version that the server is running on.
*/
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.recipe.recipes.CraftingRecipe;
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
import lombok.experimental.UtilityClass;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -17,9 +16,8 @@ import java.util.List;
/**
* Utility class to manage and register crafting recipes.
*/
@UtilityClass
@SuppressWarnings("deprecation")
public class Recipes {
public final class Recipes {
/**
* Registry of all recipes.
*/
@@ -31,7 +29,7 @@ public class Recipes {
*
* @param recipe The recipe.
*/
public void register(@NotNull final CraftingRecipe recipe) {
public static void register(@NotNull final CraftingRecipe recipe) {
RECIPES.forcePut(recipe.getKey(), recipe);
}
@@ -42,7 +40,7 @@ public class Recipes {
* @return The match, or null if not found.
*/
@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);
}
@@ -53,7 +51,7 @@ public class Recipes {
* @return The recipe, or null if not found.
*/
@Nullable
public CraftingRecipe getRecipe(@NotNull final NamespacedKey key) {
public static CraftingRecipe getRecipe(@NotNull final NamespacedKey key) {
CraftingRecipe recipe = RECIPES.get(key);
if (recipe != null) {
return recipe;
@@ -77,10 +75,10 @@ public class Recipes {
* @param recipeStrings The recipe.
* @return The recipe.
*/
public CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin,
@NotNull final String key,
@NotNull final ItemStack output,
@NotNull final List<String> recipeStrings) {
public static CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin,
@NotNull final String key,
@NotNull final ItemStack output,
@NotNull final List<String> recipeStrings) {
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key).setOutput(output);
for (int i = 0; i < 9; i++) {
@@ -92,4 +90,8 @@ public class Recipes {
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;
import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
@@ -15,7 +14,6 @@ public class MaterialTestableItem implements TestableItem {
/**
* The material.
*/
@Getter
private final Material material;
/**
@@ -44,4 +42,13 @@ public class MaterialTestableItem implements TestableItem {
public ItemStack getItem() {
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;
import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -17,13 +16,11 @@ public class ModifiedTestableItem implements TestableItem {
/**
* The item.
*/
@Getter
private final TestableItem handle;
/**
* The amount.
*/
@Getter
private final Predicate<ItemStack> test;
/**
@@ -61,4 +58,22 @@ public class ModifiedTestableItem implements TestableItem {
public ItemStack getItem() {
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;
import com.willfp.eco.core.items.TestableItem;
import lombok.Getter;
import org.apache.commons.lang.Validate;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
@@ -14,13 +13,11 @@ public class TestableStack implements TestableItem {
/**
* The item.
*/
@Getter
private final TestableItem handle;
/**
* The amount.
*/
@Getter
private final int amount;
/**
@@ -55,4 +52,22 @@ public class TestableStack implements TestableItem {
temp.setAmount(amount);
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;
import lombok.Getter;
/**
* Positions in a 3x3 crafting recipe.
*/
@@ -54,7 +52,6 @@ public enum RecipePosition {
/**
* The index within a crafting table matrix.
*/
@Getter
private final int index;
/**
@@ -65,4 +62,13 @@ public enum RecipePosition {
RecipePosition(final int 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.parts.EmptyTestableItem;
import com.willfp.eco.core.recipe.parts.TestableStack;
import lombok.Getter;
import org.bukkit.Bukkit;
import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack;
@@ -27,25 +26,21 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
/**
* Recipe parts.
*/
@Getter
private final List<TestableItem> parts;
/**
* The key of the recipe.
*/
@Getter
private final NamespacedKey key;
/**
* The key of the displayed recipe.
*/
@Getter
private final NamespacedKey displayedKey;
/**
* The recipe's output.
*/
@Getter
private final ItemStack output;
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
@@ -133,6 +128,42 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
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.
*/

View File

@@ -1,14 +1,12 @@
package com.willfp.eco.core.requirement;
import com.willfp.eco.core.Eco;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
/**
* Contains methods and fields pertaining to requirements.
*/
@UtilityClass
public class Requirements {
public final class Requirements {
/**
* Requires a player to have a permission.
*/
@@ -38,4 +36,8 @@ public class Requirements {
public static Requirement getByID(@NotNull final String 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;
import lombok.Getter;
import lombok.Setter;
import org.jetbrains.annotations.Nullable;
/**
@@ -14,16 +12,12 @@ public class Pair<A, B> {
/**
* The first item in the tuple.
*/
@Getter
@Setter
@Nullable
private A first;
/**
* The second item in the tuple.
*/
@Getter
@Setter
@Nullable
private B second;
@@ -60,4 +54,40 @@ public class Pair<A, B> {
public B component2() {
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;
import lombok.Getter;
import lombok.Setter;
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.
*/
@Getter
@Setter
@Nullable
private C third;
@@ -45,4 +41,22 @@ public class Triplet<A, B, C> extends Pair<A, B> {
public C component3() {
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;
import com.willfp.eco.core.Eco;
import lombok.Getter;
import org.jetbrains.annotations.NotNull;
import javax.net.ssl.HttpsURLConnection;
@@ -23,7 +22,6 @@ public class Paste {
/**
* The contents.
*/
@Getter
private final String contents;
/**
@@ -104,4 +102,13 @@ public class Paste {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Arrow;
import org.bukkit.inventory.ItemStack;
import org.bukkit.metadata.MetadataValue;
@@ -12,9 +11,7 @@ import java.util.List;
/**
* Utilities / API methods for arrows.
*/
@UtilityClass
public class ArrowUtils {
public final class ArrowUtils {
/**
* Get the bow from an arrow.
*
@@ -22,7 +19,7 @@ public class ArrowUtils {
* @return The bow, or null if no bow.
*/
@Nullable
public ItemStack getBow(@NotNull final Arrow arrow) {
public static ItemStack getBow(@NotNull final Arrow arrow) {
List<MetadataValue> values = arrow.getMetadata("shot-from");
if (values.isEmpty()) {
@@ -35,4 +32,8 @@ public class ArrowUtils {
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;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate;
import org.bukkit.Chunk;
import org.bukkit.Location;
@@ -21,22 +20,21 @@ import java.util.function.BiConsumer;
/**
* Utilities / API methods for blocks.
*/
@UtilityClass
public class BlockUtils {
public final class BlockUtils {
/**
* If the meta set function has been set.
*/
private boolean initialized = false;
private static boolean initialized = false;
/**
* 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,
@NotNull final List<Material> allowedMaterials,
@NotNull final Set<Block> blocks,
final int limit) {
private static Set<Block> getNearbyBlocks(@NotNull final Block start,
@NotNull final List<Material> allowedMaterials,
@NotNull final Set<Block> blocks,
final int limit) {
for (BlockFace face : BlockFace.values()) {
Block block = start.getRelative(face);
if (blocks.contains(block)) {
@@ -66,9 +64,9 @@ public class BlockUtils {
* @return A set of all {@link Block}s.
*/
@NotNull
public Set<Block> getVein(@NotNull final Block start,
@NotNull final List<Material> allowedMaterials,
final int limit) {
public static Set<Block> getVein(@NotNull final Block start,
@NotNull final List<Material> allowedMaterials,
final int 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 block The block to break.
*/
public void breakBlock(@NotNull final Player player,
@NotNull final Block block) {
public static void breakBlock(@NotNull final Player player,
@NotNull final Block block) {
Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(blockBreakConsumer, "Must be initialized!");
@@ -100,7 +98,7 @@ public class BlockUtils {
* @param block The block.
* @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();
return chunk.getPersistentDataContainer().has(
@@ -115,11 +113,15 @@ public class BlockUtils {
* @param function The function.
*/
@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!");
blockBreakConsumer = function;
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;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for classes.
*/
@UtilityClass
public class ClassUtils {
public final class ClassUtils {
/**
* Get if a class exists.
*
@@ -15,7 +13,7 @@ public class ClassUtils {
* @return If the class exists.
* @see Class#forName(String)
*/
public boolean exists(@NotNull final String className) {
public static boolean exists(@NotNull final String className) {
try {
Class.forName(className);
return true;
@@ -23,4 +21,8 @@ public class ClassUtils {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit;
import org.bukkit.Material;
import org.bukkit.Sound;
@@ -17,8 +16,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for item durability.
*/
@UtilityClass
public class DurabilityUtils {
public final class DurabilityUtils {
/**
* Damage an item in a player's inventory.
* 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 slot The slot in the inventory of the item.
*/
public void damageItem(@NotNull final Player player,
@NotNull final ItemStack item,
final int damage,
final int slot) {
public static void damageItem(@NotNull final Player player,
@NotNull final ItemStack item,
final int damage,
final int slot) {
if (item.getItemMeta() == null) {
return;
}
@@ -78,9 +76,9 @@ public class DurabilityUtils {
* @param damage The amount of damage to deal.
* @param player The player.
*/
public void damageItemNoBreak(@NotNull final ItemStack item,
final int damage,
@NotNull final Player player) {
public static void damageItemNoBreak(@NotNull final ItemStack item,
final int damage,
@NotNull final Player player) {
if (item.getItemMeta() == null) {
return;
}
@@ -114,8 +112,8 @@ public class DurabilityUtils {
* @param item The item to damage.
* @param repair The amount of damage to heal.
*/
public void repairItem(@NotNull final ItemStack item,
final int repair) {
public static void repairItem(@NotNull final ItemStack item,
final int repair) {
if (item.getItemMeta() == null) {
return;
}
@@ -133,4 +131,8 @@ public class DurabilityUtils {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.LivingEntity;
@@ -9,9 +8,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for lightning.
*/
@UtilityClass
public class LightningUtils {
public final class LightningUtils {
/**
* Strike lightning on player without fire.
*
@@ -19,9 +16,9 @@ public class LightningUtils {
* @param damage The damage to deal.
* @param silent If the lightning sound should be played locally
*/
public void strike(@NotNull final LivingEntity victim,
final double damage,
final boolean silent) {
public static void strike(@NotNull final LivingEntity victim,
final double damage,
final boolean silent) {
Location loc = victim.getLocation();
if (silent) {
@@ -40,8 +37,12 @@ public class LightningUtils {
* @param victim The entity to smite.
* @param damage The damage to deal.
*/
public void strike(@NotNull final LivingEntity victim,
final double damage) {
public static void strike(@NotNull final LivingEntity victim,
final double damage) {
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;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
@@ -12,8 +11,7 @@ import java.util.Map;
/**
* Utilities / API methods for lists.
*/
@UtilityClass
public class ListUtils {
public final class ListUtils {
/**
* Initialize 2D list of a given size.
*
@@ -57,4 +55,8 @@ public class ListUtils {
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;
import com.willfp.eco.core.tuples.Pair;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for menus.
*/
@UtilityClass
public class MenuUtils {
public final class MenuUtils {
/**
* Convert 0-53 slot to row and column pair.
*
@@ -16,9 +14,13 @@ public class MenuUtils {
* @return The pair of row and columns.
*/
@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 column = slot - row * 9;
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;
import lombok.experimental.UtilityClass;
import org.bukkit.NamespacedKey;
import org.jetbrains.annotations.NotNull;
@@ -9,8 +8,7 @@ import java.util.Objects;
/**
* Utilities / API methods for {@link NamespacedKey}s.
*/
@UtilityClass
public class NamespacedKeyUtils {
public final class NamespacedKeyUtils {
/**
* Create a NamespacedKey for eco.
*
@@ -18,7 +16,7 @@ public class NamespacedKeyUtils {
* @return The key.
*/
@NotNull
public NamespacedKey createEcoKey(@NotNull final String string) {
public static NamespacedKey createEcoKey(@NotNull final String string) {
return Objects.requireNonNull(NamespacedKey.fromString("eco:" + string));
}
@@ -30,8 +28,12 @@ public class NamespacedKeyUtils {
* @return The key.
*/
@NotNull
public NamespacedKey create(@NotNull final String namespace,
@NotNull final String key) {
public static NamespacedKey create(@NotNull final String namespace,
@NotNull final String 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;
import lombok.experimental.UtilityClass;
import org.jetbrains.annotations.NotNull;
import java.text.DecimalFormat;
@@ -11,8 +10,7 @@ import java.util.concurrent.ThreadLocalRandom;
/**
* Utilities / API methods for numbers.
*/
@UtilityClass
public class NumberUtils {
public final class NumberUtils {
/**
* 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.
* @return The biased output.
*/
public double bias(final double input,
final double bias) {
public static double bias(final double input,
final double bias) {
double k = Math.pow(1 - bias, 3);
return (input * k) / (input * k - input + 1);
@@ -86,8 +84,8 @@ public class NumberUtils {
* @param limit The maximum.
* @return The new value.
*/
public int equalIfOver(final int toChange,
final int limit) {
public static int equalIfOver(final int toChange,
final int limit) {
return Math.min(toChange, limit);
}
@@ -98,8 +96,8 @@ public class NumberUtils {
* @param limit The maximum.
* @return The new value.
*/
public double equalIfOver(final double toChange,
final double limit) {
public static double equalIfOver(final double toChange,
final double limit) {
return Math.min(toChange, limit);
}
@@ -110,7 +108,7 @@ public class NumberUtils {
* @return The number, converted to a roman numeral.
*/
@NotNull
public String toNumeral(final int number) {
public static String toNumeral(final int number) {
if (number >= 1 && number <= 4096) {
int l = NUMERALS.floorKey(number);
if (number == l) {
@@ -147,8 +145,8 @@ public class NumberUtils {
* @param max Maximum.
* @return Random integer.
*/
public int randInt(final int min,
final int max) {
public static int randInt(final int min,
final int max) {
return ThreadLocalRandom.current().nextInt(min, max + 1);
}
@@ -159,8 +157,8 @@ public class NumberUtils {
* @param max Maximum.
* @return Random double.
*/
public double randFloat(final double min,
final double max) {
public static double randFloat(final double min,
final double max) {
return ThreadLocalRandom.current().nextDouble(min, max);
}
@@ -172,9 +170,9 @@ public class NumberUtils {
* @param peak Peak.
* @return Random double.
*/
public double triangularDistribution(final double minimum,
final double maximum,
final double peak) {
public static double triangularDistribution(final double minimum,
final double maximum,
final double peak) {
double f = (peak - minimum) / (maximum - minimum);
double rand = Math.random();
if (rand < f) {
@@ -190,7 +188,7 @@ public class NumberUtils {
* @param toLog The number.
* @return The result.
*/
public int log2(final int toLog) {
public static int log2(final int toLog) {
return (int) (Math.log(toLog) / Math.log(2));
}
@@ -201,10 +199,14 @@ public class NumberUtils {
* @return Formatted.
*/
@NotNull
public String format(final double toFormat) {
public static String format(final double toFormat) {
DecimalFormat df = new DecimalFormat("0.00");
String formatted = df.format(toFormat);
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.keys.PersistentDataKey;
import com.willfp.eco.core.data.keys.PersistentDataKeyType;
import lombok.experimental.UtilityClass;
import net.kyori.adventure.audience.Audience;
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
import org.bukkit.OfflinePlayer;
@@ -16,8 +15,7 @@ import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for players.
*/
@UtilityClass
public class PlayerUtils {
public final class PlayerUtils {
/**
* The data key for saved player names.
*/
@@ -34,7 +32,7 @@ public class PlayerUtils {
* @return The audience.
*/
@NotNull
public Audience getAudience(@NotNull final Player player) {
public static Audience getAudience(@NotNull final Player player) {
BukkitAudiences adventure = Eco.getHandler().getAdventure();
if (Prerequisite.HAS_PAPER.isMet()) {
@@ -59,7 +57,7 @@ public class PlayerUtils {
* @return The audience.
*/
@NotNull
public Audience getAudience(@NotNull final CommandSender sender) {
public static Audience getAudience(@NotNull final CommandSender sender) {
BukkitAudiences adventure = Eco.getHandler().getAdventure();
if (Prerequisite.HAS_PAPER.isMet()) {
@@ -83,14 +81,24 @@ public class PlayerUtils {
* @param player The player.
* @return The player name.
*/
public String getSavedDisplayName(@NotNull final OfflinePlayer player) {
public static String getSavedDisplayName(@NotNull final OfflinePlayer player) {
PlayerProfile profile = PlayerProfile.load(player);
if (player instanceof Player onlinePlayer) {
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.
*/
public void updateSavedDisplayName(@NotNull final Player player) {
public static void updateSavedDisplayName(@NotNull final Player player) {
PlayerProfile profile = PlayerProfile.load(player);
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;
import lombok.experimental.UtilityClass;
import org.bukkit.potion.PotionData;
import org.jetbrains.annotations.NotNull;
/**
* Utilities / API methods for potions.
*/
@UtilityClass
public class PotionUtils {
public final class PotionUtils {
/**
* Get the duration (in ticks) for potion data.
*
* @param data The data.
* @return The duration.
*/
public int getDuration(@NotNull final PotionData data) {
public static int getDuration(@NotNull final PotionData data) {
if (data.isExtended()) {
return switch (data.getType()) {
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0;
@@ -44,4 +42,8 @@ public class PotionUtils {
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;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
@@ -10,19 +9,18 @@ import java.util.function.Supplier;
/**
* Utilities / API methods for the server.
*/
@UtilityClass
public class ServerUtils {
public final class ServerUtils {
/**
* The TPS supplier.
*/
private Supplier<Double> tpsSupplier = null;
private static Supplier<Double> tpsSupplier = null;
/**
* Get the current server TPS.
*
* @return The TPS.
*/
public double getTps() {
public static double getTps() {
Validate.notNull(tpsSupplier, "Not initialized!");
double tps = tpsSupplier.get();
@@ -40,9 +38,13 @@ public class ServerUtils {
* @param function The function.
*/
@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!");
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;
import lombok.experimental.UtilityClass;
import org.apache.commons.lang.Validate;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.ApiStatus;
@@ -13,22 +12,21 @@ import java.util.function.Function;
/**
* Utilities / API methods for player heads.
*/
@UtilityClass
public class SkullUtils {
public final class SkullUtils {
/**
* If the meta set function has been set.
*/
private boolean initialized = false;
private static boolean initialized = false;
/**
* The meta set function.
*/
private BiConsumer<SkullMeta, String> metaSetConsumer = null;
private static BiConsumer<SkullMeta, String> metaSetConsumer = null;
/**
* 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.
@@ -36,7 +34,7 @@ public class SkullUtils {
* @param meta The meta to modify.
* @param base64 The base64 texture.
*/
public void setSkullTexture(@NotNull final SkullMeta meta,
public static void setSkullTexture(@NotNull final SkullMeta meta,
@NotNull final String base64) {
Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaSetConsumer, "Must be initialized!");
@@ -51,7 +49,7 @@ public class SkullUtils {
* @return The texture, potentially null.
*/
@Nullable
public String getSkullTexture(@NotNull final SkullMeta meta) {
public static String getSkullTexture(@NotNull final SkullMeta meta) {
Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaGetConsumer, "Must be initialized!");
@@ -65,7 +63,7 @@ public class SkullUtils {
* @param function2 Get function.
*/
@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) {
Validate.isTrue(!initialized, "Already initialized!");
@@ -73,4 +71,8 @@ public class SkullUtils {
metaGetConsumer = function2;
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.willfp.eco.core.Prerequisite;
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
import lombok.experimental.UtilityClass;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.format.TextDecoration;
import net.kyori.adventure.text.minimessage.MiniMessage;
@@ -25,18 +24,10 @@ import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.
*/
@UtilityClass
public class StringUtils {
public final class StringUtils {
/**
* Regexes for gradients.
*/
@@ -72,16 +63,16 @@ public class StringUtils {
* Color map.
*/
private static final Map<String, ChatColor> COLOR_MAP = new ImmutableMap.Builder<String, ChatColor>()
.put("&l", BOLD)
.put("&o", ITALIC)
.put("&n", UNDERLINE)
.put("&m", STRIKETHROUGH)
.put("&k", MAGIC)
.put("§l", BOLD)
.put("§o", ITALIC)
.put("§n", UNDERLINE)
.put("§m", STRIKETHROUGH)
.put("§k", MAGIC)
.put("&l", ChatColor.BOLD)
.put("&o", ChatColor.ITALIC)
.put("&n", ChatColor.UNDERLINE)
.put("&m", ChatColor.STRIKETHROUGH)
.put("&k", ChatColor.MAGIC)
.put("§l", ChatColor.BOLD)
.put("§o", ChatColor.ITALIC)
.put("§n", ChatColor.UNDERLINE)
.put("§m", ChatColor.STRIKETHROUGH)
.put("§k", ChatColor.MAGIC)
.build();
/**
@@ -93,7 +84,7 @@ public class StringUtils {
* @return The message, formatted.
*/
@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);
}
@@ -107,8 +98,8 @@ public class StringUtils {
* @return The message, format.
*/
@NotNull
public List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player) {
public static List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player) {
return formatList(list, player, FormatOption.WITH_PLACEHOLDERS);
}
@@ -122,8 +113,8 @@ public class StringUtils {
* @return The message, formatted.
*/
@NotNull
public List<String> formatList(@NotNull final List<String> list,
@NotNull final FormatOption option) {
public static List<String> formatList(@NotNull final List<String> list,
@NotNull final FormatOption option) {
return formatList(list, null, option);
}
@@ -138,9 +129,9 @@ public class StringUtils {
* @return The message, format.
*/
@NotNull
public List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player,
@NotNull final FormatOption option) {
public static List<String> formatList(@NotNull final List<String> list,
@Nullable final Player player,
@NotNull final FormatOption option) {
List<String> translated = new ArrayList<>();
for (String string : list) {
translated.add(format(string, player, option));
@@ -159,7 +150,7 @@ public class StringUtils {
* @see StringUtils#format(String, Player)
*/
@NotNull
public String format(@NotNull final String message) {
public static String format(@NotNull final String message) {
return format(message, (Player) null);
}
@@ -173,8 +164,8 @@ public class StringUtils {
* @return The message, formatted.
*/
@NotNull
public String format(@NotNull final String message,
@Nullable final Player player) {
public static String format(@NotNull final String message,
@Nullable final Player player) {
return format(message, player, FormatOption.WITH_PLACEHOLDERS);
}
@@ -189,8 +180,8 @@ public class StringUtils {
* @see StringUtils#format(String, Player)
*/
@NotNull
public String format(@NotNull final String message,
@NotNull final FormatOption option) {
public static String format(@NotNull final String message,
@NotNull final FormatOption option) {
return format(message, null, option);
}
@@ -204,7 +195,7 @@ public class StringUtils {
* @see StringUtils#format(String, Player)
*/
@NotNull
public Component formatToComponent(@NotNull final String message) {
public static Component formatToComponent(@NotNull final String message) {
return formatToComponent(message, (Player) null);
}
@@ -218,8 +209,8 @@ public class StringUtils {
* @return The message, formatted.
*/
@NotNull
public Component formatToComponent(@NotNull final String message,
@Nullable final Player player) {
public static Component formatToComponent(@NotNull final String message,
@Nullable final Player player) {
return formatToComponent(message, player, FormatOption.WITH_PLACEHOLDERS);
}
@@ -234,8 +225,8 @@ public class StringUtils {
* @see StringUtils#format(String, Player)
*/
@NotNull
public Component formatToComponent(@NotNull final String message,
@NotNull final FormatOption option) {
public static Component formatToComponent(@NotNull final String message,
@NotNull final FormatOption option) {
return formatToComponent(message, null, option);
}
@@ -250,9 +241,9 @@ public class StringUtils {
* @return The message, formatted, as a component.
*/
@NotNull
public Component formatToComponent(@NotNull final String message,
@Nullable final Player player,
@NotNull final FormatOption option) {
public static Component formatToComponent(@NotNull final String message,
@Nullable final Player player,
@NotNull final FormatOption option) {
return toComponent(format(message, player, option));
}
@@ -267,9 +258,9 @@ public class StringUtils {
* @return The message, formatted.
*/
@NotNull
public String format(@NotNull final String message,
@Nullable final Player player,
@NotNull final FormatOption option) {
public static String format(@NotNull final String message,
@Nullable final Player player,
@NotNull final FormatOption option) {
String processedMessage = message;
if (option == FormatOption.WITH_PLACEHOLDERS) {
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
@@ -302,10 +293,10 @@ public class StringUtils {
StringBuilder builder = new StringBuilder(message.length() + 4 * 8);
while (matcher.find()) {
String group = matcher.group(1);
matcher.appendReplacement(builder, COLOR_CHAR + "x"
+ COLOR_CHAR + group.charAt(0) + COLOR_CHAR + group.charAt(1)
+ COLOR_CHAR + group.charAt(2) + COLOR_CHAR + group.charAt(3)
+ COLOR_CHAR + group.charAt(4) + COLOR_CHAR + group.charAt(5));
matcher.appendReplacement(builder, ChatColor.COLOR_CHAR + "x"
+ ChatColor.COLOR_CHAR + group.charAt(0) + ChatColor.COLOR_CHAR + group.charAt(1)
+ ChatColor.COLOR_CHAR + group.charAt(2) + ChatColor.COLOR_CHAR + group.charAt(3)
+ ChatColor.COLOR_CHAR + group.charAt(4) + ChatColor.COLOR_CHAR + group.charAt(5));
}
return matcher.appendTail(builder).toString();
@@ -379,7 +370,7 @@ public class StringUtils {
* @return The object stringified.
*/
@NotNull
public String internalToString(@Nullable final Object object) {
public static String internalToString(@Nullable final Object object) {
if (object == null) {
return "null";
}
@@ -405,8 +396,8 @@ public class StringUtils {
* @return The string with the prefix removed.
*/
@NotNull
public String removePrefix(@NotNull final String string,
@NotNull final String prefix) {
public static String removePrefix(@NotNull final String string,
@NotNull final String prefix) {
if (string.startsWith(prefix)) {
return string.substring(prefix.length());
}
@@ -420,7 +411,7 @@ public class StringUtils {
* @return The JSON String.
*/
@NotNull
public String legacyToJson(@Nullable final String legacy) {
public static String legacyToJson(@Nullable final String legacy) {
String processed = legacy;
if (legacy == null) {
processed = "";
@@ -439,7 +430,7 @@ public class StringUtils {
* @return The legacy string.
*/
@NotNull
public String jsonToLegacy(@NotNull final String json) {
public static String jsonToLegacy(@NotNull final String json) {
return LEGACY_COMPONENT_SERIALIZER.serialize(
GsonComponentSerializer.gson().deserialize(json)
);
@@ -452,7 +443,7 @@ public class StringUtils {
* @return The component.
*/
@NotNull
public Component toComponent(@Nullable final String legacy) {
public static Component toComponent(@Nullable final String legacy) {
String processed = legacy;
if (legacy == null) {
processed = "";
@@ -468,7 +459,7 @@ public class StringUtils {
* @return The legacy text.
*/
@NotNull
public String toLegacy(@NotNull final Component component) {
public static String toLegacy(@NotNull final Component component) {
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
}
@@ -486,4 +477,8 @@ public class StringUtils {
*/
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.HashBiMap;
import com.willfp.eco.core.Prerequisite;
import lombok.experimental.UtilityClass;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.Material;
@@ -13,13 +12,13 @@ import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;
import java.util.stream.Collectors;
/**
* Utilities / API methods for teams.
*/
@UtilityClass
public class TeamUtils {
public final class TeamUtils {
/**
* Ore ChatColors.
*/
@@ -33,7 +32,7 @@ public class TeamUtils {
/**
* 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}.
@@ -44,7 +43,7 @@ public class TeamUtils {
* @return The team.
*/
@NotNull
public Team fromChatColor(@NotNull final ChatColor color) {
public static Team fromChatColor(@NotNull final ChatColor color) {
if (CHAT_COLOR_TEAMS.containsKey(color)) {
return CHAT_COLOR_TEAMS.get(color);
}
@@ -72,7 +71,7 @@ public class TeamUtils {
* @return The team.
*/
@NotNull
public Team getMaterialColorTeam(@NotNull final Material material) {
public static Team getMaterialColorTeam(@NotNull final Material material) {
return fromChatColor(MATERIAL_COLORS.getOrDefault(material, ChatColor.WHITE));
}
@@ -102,4 +101,8 @@ public class TeamUtils {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.entity.Player;
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
* rather than dropping on the ground.
*/
@UtilityClass
public final class TelekinesisUtils {
/**
* 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.
*/
public void registerTest(@NotNull final Function<Player, Boolean> test) {
public static void registerTest(@NotNull final Function<Player, Boolean> test) {
TESTS.add(test);
}
@@ -38,7 +36,7 @@ public final class TelekinesisUtils {
* @param player The player to test.
* @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) {
if (test.apply(player)) {
return true;
@@ -47,4 +45,8 @@ public final class TelekinesisUtils {
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;
import lombok.experimental.UtilityClass;
import org.bukkit.util.NumberConversions;
import org.bukkit.util.Vector;
import org.jetbrains.annotations.NotNull;
@@ -13,8 +12,7 @@ import java.util.Map;
/**
* Utilities / API methods for vectors.
*/
@UtilityClass
public class VectorUtils {
public final class VectorUtils {
/**
* Cached circles to prevent many sqrt calls.
*/
@@ -26,7 +24,7 @@ public class VectorUtils {
* @param vector The vector to check.
* @return If the vector is finite.
*/
public boolean isFinite(@NotNull final Vector vector) {
public static boolean isFinite(@NotNull final Vector vector) {
try {
NumberConversions.checkFinite(vector.getX(), "x not finite");
NumberConversions.checkFinite(vector.getY(), "y not finite");
@@ -45,7 +43,7 @@ public class VectorUtils {
* @return The vector, simplified.
*/
@NotNull
public Vector simplifyVector(@NotNull final Vector vec) {
public static Vector simplifyVector(@NotNull final Vector vec) {
double x = Math.abs(vec.getX());
double y = Math.abs(vec.getY());
double z = Math.abs(vec.getZ());
@@ -78,7 +76,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s.
*/
@NotNull
public Vector[] getCircle(final int radius) {
public static Vector[] getCircle(final int radius) {
Vector[] cached = CIRCLE_CACHE.get(radius);
if (cached != null) {
return cached;
@@ -115,7 +113,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s.
*/
@NotNull
public Vector[] getSquare(final int radius) {
public static Vector[] getSquare(final int radius) {
List<Vector> vectors = new ArrayList<>();
int xoffset = -radius;
@@ -140,7 +138,7 @@ public class VectorUtils {
* @return An array of {@link Vector}s.
*/
@NotNull
public Vector[] getCube(final int radius) {
public static Vector[] getCube(final int radius) {
List<Vector> vectors = new ArrayList<>();
for (int y = -radius; y <= radius; y++) {
@@ -153,4 +151,8 @@ public class VectorUtils {
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.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.StringUtils
import java.util.*
import java.util.Objects
import java.util.concurrent.ConcurrentHashMap
@Suppress("UNCHECKED_CAST")
open class EcoJSONConfigWrapper : JSONConfig {
val handle: Gson = GsonBuilder().setPrettyPrinting().create()
val handle: Gson = GsonBuilder()
.setPrettyPrinting()
.disableHtmlEscaping()
.create()
val values = ConcurrentHashMap<String, Any?>()
@@ -273,6 +276,6 @@ open class EcoJSONConfigWrapper : 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.keys.PersistentDataKey
import java.util.*
import java.util.concurrent.ConcurrentHashMap
class EcoPlayerProfile(
val data: MutableMap<PersistentDataKey<*>, Any>
val data: MutableMap<PersistentDataKey<*>, Any>,
val uuid: UUID
) : PlayerProfile {
override fun <T : Any> write(key: PersistentDataKey<T>, value: T) {
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 {
@Suppress("UNCHECKED_CAST")
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
import com.google.common.util.concurrent.ThreadFactoryBuilder
import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.display.Display
import com.willfp.eco.core.display.DisplayHandler
@@ -11,8 +10,6 @@ import org.bukkit.NamespacedKey
import org.bukkit.entity.Player
import org.bukkit.inventory.ItemStack
import org.bukkit.persistence.PersistentDataType
import java.util.concurrent.ExecutorService
import java.util.concurrent.Executors
class EcoDisplayHandler(plugin: EcoPlugin) : DisplayHandler {
private val registeredModules = mutableMapOf<DisplayPriority, MutableList<DisplayModule>>()

View File

@@ -41,8 +41,6 @@ dependencies {
compileOnly 'world.bentobox:bentobox:1.17.3-SNAPSHOT'
compileOnly 'com.google.guava:guava:31.0.1-jre'
compileOnly 'com.iridium:IridiumSkyblock:3.1.2'
compileOnly 'net.md-5:bungeecord-api:1.16-R0.5-SNAPSHOT'
compileOnly 'com.velocitypowered:velocity-api:3.0.0-SNAPSHOT'
// CombatLogX V10 + NewbieHelper Expansion
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'

View File

@@ -10,6 +10,7 @@ import com.willfp.eco.core.recipe.parts.ModifiedTestableItem;
import com.willfp.eco.core.recipe.parts.TestableStack;
import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
import org.bukkit.Keyed;
import org.bukkit.Material;
import org.bukkit.event.Event;
import org.bukkit.event.EventHandler;
@@ -245,7 +246,7 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
@EventHandler
public void preventUsingComplexPartInVanillaRecipe(@NotNull final PrepareItemCraftEvent event) {
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
if (!(event.getRecipe() instanceof Keyed recipe)) {
return;
}
@@ -263,7 +264,7 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
@EventHandler
public void preventUsingComplexPartInVanillaRecipe(@NotNull final CraftItemEvent event) {
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
if (!(event.getRecipe() instanceof Keyed recipe)) {
return;
}

View File

@@ -38,6 +38,8 @@ import com.willfp.eco.internal.scheduling.EcoScheduler
import com.willfp.eco.proxy.FastItemStackFactoryProxy
import com.willfp.eco.spigot.data.EcoKeyRegistry
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 net.kyori.adventure.platform.bukkit.BukkitAudiences
import org.bukkit.inventory.ItemStack
@@ -49,7 +51,10 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
private val requirementFactory = EcoRequirementFactory()
private var adventure: BukkitAudiences? = null
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 {
return EcoScheduler(plugin)

View File

@@ -24,10 +24,9 @@ import com.willfp.eco.proxy.FastItemStackFactoryProxy
import com.willfp.eco.proxy.SkullProxy
import com.willfp.eco.proxy.TPSProxy
import com.willfp.eco.spigot.arrows.ArrowDataListener
import com.willfp.eco.spigot.data.*
import com.willfp.eco.spigot.data.storage.DataHandler
import com.willfp.eco.spigot.data.storage.MySQLDataHandler
import com.willfp.eco.spigot.data.storage.YamlDataHandler
import com.willfp.eco.spigot.data.DataListener
import com.willfp.eco.spigot.data.PlayerBlockListener
import com.willfp.eco.spigot.data.storage.ProfileSaver
import com.willfp.eco.spigot.display.*
import com.willfp.eco.spigot.display.frame.clearFrames
import com.willfp.eco.spigot.drops.CollatedRunnable
@@ -68,8 +67,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
"com.willfp.eco.proxy",
"&a"
) {
lateinit var dataHandler: DataHandler
init {
Items.registerArgParser(EnchantmentArgParser())
Items.registerArgParser(TextureArgParser())
@@ -91,9 +88,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
private fun postInit() {
Display.setHandler(EcoDisplayHandler(this))
this.dataHandler = if (this.configYml.getBool("mysql.enabled"))
MySQLDataHandler(this) else YamlDataHandler(this)
}
override fun handleEnable() {
@@ -119,13 +113,14 @@ abstract class EcoSpigotPlugin : EcoPlugin(
logger.severe("")
}
// Init FIS
this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap()
}
override fun handleDisable() {
this.logger.info("Saving player data...")
val start = System.currentTimeMillis()
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).saveAllBlocking()
Eco.getHandler().playerProfileHandler.save()
this.logger.info("Saved player data! Took ${System.currentTimeMillis() - start}ms")
Eco.getHandler().adventure?.close()
}
@@ -133,19 +128,12 @@ abstract class EcoSpigotPlugin : EcoPlugin(
override fun handleReload() {
CollatedRunnable(this)
DropManager.update(this)
ProfileSaver(this)
this.scheduler.runTimer(
{ clearFrames() },
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.getInt("autosave.ticks").toLong(),
this.configYml.getInt("autosave.ticks").toLong()
)
}
override fun handleAfterLoad() {
@@ -233,7 +221,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
}
override fun loadListeners(): List<Listener> {
val listeners = mutableListOf(
return listOf(
NaturalExpGainListeners(),
ArmorListener(),
EntityDeathByEntityListeners(this),
@@ -245,15 +233,5 @@ abstract class EcoSpigotPlugin : EcoPlugin(
DataListener(),
PlayerBlockListener(this)
)
if (Prerequisite.HAS_BUNGEECORD.isMet) {
listeners.add(BungeeDataListener())
}
if (Prerequisite.HAS_VELOCITY.isMet) {
listeners.add(VelocityDataListener())
}
return listeners
}
}

View File

@@ -1,25 +0,0 @@
package com.willfp.eco.spigot.data
import com.willfp.eco.core.Eco
import net.md_5.bungee.api.event.ServerConnectedEvent
import net.md_5.bungee.api.event.ServerDisconnectEvent
import net.md_5.bungee.api.event.ServerSwitchEvent
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
class BungeeDataListener : Listener {
@EventHandler
fun onConnected(event: ServerConnectedEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
}
@EventHandler
fun onDisconnect(event: ServerDisconnectEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
}
@EventHandler
fun onSwitch(event: ServerSwitchEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
}
}

View File

@@ -5,18 +5,23 @@ import com.willfp.eco.util.PlayerUtils
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerLoginEvent
import org.bukkit.event.player.PlayerQuitEvent
class DataListener : Listener {
@EventHandler
fun onLeave(event: PlayerQuitEvent) {
PlayerUtils.updateSavedDisplayName(event.player)
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
}
@EventHandler
fun onJoin(event: PlayerJoinEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
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
import com.willfp.eco.core.Eco
import com.willfp.eco.core.data.keys.KeyRegistry
import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.core.data.keys.PersistentDataKeyType
@@ -20,7 +21,7 @@ class EcoKeyRegistry(
this.registry[key.key] = key
plugin.dataHandler.updateKeys()
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).updateKeys()
}
override fun getRegisteredKeys(): MutableSet<PersistentDataKey<*>> {

View File

@@ -1,19 +1,16 @@
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.PlayerProfileHandler
import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.internal.data.EcoPlayerProfile
import com.willfp.eco.spigot.EcoSpigotPlugin
import org.bukkit.Bukkit
import com.willfp.eco.spigot.data.storage.DataHandler
import java.util.UUID
class EcoPlayerProfileHandler(
private val plugin: EcoSpigotPlugin
private val handler: DataHandler
) : PlayerProfileHandler {
private val loaded = mutableMapOf<UUID, PlayerProfile>()
private val handler = plugin.dataHandler
override fun load(uuid: UUID): PlayerProfile {
val found = loaded[uuid]
@@ -23,45 +20,36 @@ class EcoPlayerProfileHandler(
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
}
val profile = EcoPlayerProfile(data)
val profile = EcoPlayerProfile(data, uuid)
loaded[uuid] = profile
return profile
}
fun unloadPlayer(uuid: UUID) {
handler.savePlayer(uuid)
loaded.remove(uuid)
override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
val profile = PlayerProfile.load(uuid)
for (key in keys) {
handler.write(uuid, key.key, profile.read(key))
}
}
override fun savePlayer(uuid: UUID) {
handler.savePlayer(uuid)
override fun unloadPlayer(uuid: UUID) {
loaded.remove(uuid)
}
override fun saveAll() {
handler.saveAll(loaded.keys.toList())
}
fun saveAllBlocking() {
handler.saveAllBlocking(loaded.keys.toList())
override fun save() {
handler.save()
}
fun autosave() {
if (Bukkit.getOnlinePlayers().isEmpty()) {
return
}
if (plugin.configYml.getBool("autosave.log")) {
plugin.logger.info("Auto-Saving player data!")
}
saveAll()
if (plugin.configYml.getBool("autosave.log")) {
plugin.logger.info("Saved player data!")
}
fun updateKeys() {
handler.updateKeys()
}
}

View File

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

View File

@@ -1,19 +0,0 @@
package com.willfp.eco.spigot.data
import com.velocitypowered.api.event.connection.DisconnectEvent
import com.velocitypowered.api.event.player.ServerConnectedEvent
import com.willfp.eco.core.Eco
import org.bukkit.event.EventHandler
import org.bukkit.event.Listener
class VelocityDataListener : Listener {
@EventHandler
fun onConnected(event: ServerConnectedEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
}
@EventHandler
fun onDisconnect(event: DisconnectEvent) {
(Eco.getHandler().playerProfileHandler as EcoPlayerProfileHandler).unloadPlayer(event.player.uniqueId)
}
}

View File

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

View File

@@ -9,23 +9,9 @@ import com.willfp.eco.spigot.EcoSpigotPlugin
import org.apache.logging.log4j.Level
import org.bukkit.NamespacedKey
import org.jetbrains.exposed.dao.id.UUIDTable
import org.jetbrains.exposed.sql.BooleanColumnType
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.Table
import org.jetbrains.exposed.sql.VarCharColumnType
import org.jetbrains.exposed.sql.checkMappingConsistence
import org.jetbrains.exposed.sql.exposedLogger
import org.jetbrains.exposed.sql.insert
import org.jetbrains.exposed.sql.select
import org.jetbrains.exposed.sql.transactions.TransactionManager
import org.jetbrains.exposed.sql.*
import org.jetbrains.exposed.sql.transactions.transaction
import org.jetbrains.exposed.sql.update
import java.util.UUID
import java.util.*
import java.util.concurrent.Executors
@Suppress("UNCHECKED_CAST")
@@ -76,26 +62,20 @@ class MySQLDataHandler(
writeAsserted(uuid, key, value)
}
private fun <T> writeAsserted(uuid: UUID, key: NamespacedKey, value: T, async: Boolean = true) {
private fun <T> writeAsserted(uuid: UUID, key: NamespacedKey, value: T) {
val column: Column<T> = getColumn(key.toString()) as Column<T>
fun executeTransaction() {
executor.submit {
transaction {
Players.update({ Players.id eq uuid }) {
it[column] = value
}
}
}
if (async) {
executor.execute { executeTransaction() }
} else {
executeTransaction()
}
}
override fun savePlayer(uuid: UUID) {
savePlayer(uuid, async = false)
override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
savePlayer(uuid, keys)
}
override fun saveAll(uuids: Iterable<UUID>) {
@@ -104,20 +84,16 @@ class MySQLDataHandler(
}
}
override fun saveAllBlocking(uuids: Iterable<UUID>) {
for (uuid in uuids) {
savePlayer(uuid, async = false)
}
}
private fun savePlayer(uuid: UUID, async: Boolean = true) {
private fun savePlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
val profile = PlayerProfile.load(uuid)
transaction {
getPlayer(uuid)
executor.submit {
transaction {
getPlayer(uuid)
for (key in Eco.getHandler().keyRegistry.registeredKeys) {
writeAsserted(uuid, key.key, profile.read(key), async = async)
for (key in keys) {
writeAsserted(uuid, key.key, profile.read(key))
}
}
}
}
@@ -128,6 +104,7 @@ class MySQLDataHandler(
val player = getPlayer(uuid)
value = player[getColumn(key.toString())] as T?
}
return value
}
@@ -178,27 +155,4 @@ class MySQLDataHandler(
getPlayer(uuid)
}
}
private fun createMissingTablesAndColumnsSilently(table: Table) {
with(TransactionManager.current()) {
fun execStatements(statements: List<String>) {
for (statement in statements) {
exec(statement)
}
}
db.dialect.resetCaches()
val createStatements = SchemaUtils.createStatements(table)
execStatements(createStatements)
commit()
val alterStatements = SchemaUtils.addMissingColumnsStatements(table)
execStatements(alterStatements)
commit()
val executedStatements = createStatements + alterStatements
val modifyTablesStatements = checkMappingConsistence(table).filter { it !in executedStatements }
execStatements(modifyTablesStatements)
commit()
db.dialect.resetCaches()
}
}
}

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,11 +1,11 @@
package com.willfp.eco.spigot.data.storage
import com.willfp.eco.core.Eco
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 org.bukkit.NamespacedKey
import java.util.UUID
import java.util.*
@Suppress("UNCHECKED_CAST")
class YamlDataHandler(
@@ -25,10 +25,10 @@ class YamlDataHandler(
save()
}
override fun savePlayer(uuid: UUID) {
override fun saveKeysForPlayer(uuid: UUID, keys: Set<PersistentDataKey<*>>) {
val profile = PlayerProfile.load(uuid)
for (key in Eco.getHandler().keyRegistry.registeredKeys) {
for (key in keys) {
write(uuid, key.key, profile.read(key))
}
}

View File

@@ -63,7 +63,8 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
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")
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 {
@@ -104,7 +105,7 @@ class PacketWindowItems(plugin: EcoPlugin) : AbstractPacketAdapter(plugin, Packe
return false
}
if (this.getPlugin().configYml.getBool("async-display.enabled")) {
if (this.getPlugin().configYml.getBool("async-display.always-enabled")) {
return true
}

View File

@@ -9,25 +9,25 @@ import org.bukkit.entity.Player
class AntigriefDeluxeCombat: AntigriefWrapper {
override fun getPluginName(): String {
return "DeluxeCombat";
return "DeluxeCombat"
}
override fun canBreakBlock(player: Player, block: Block): Boolean {
return true;
return true
}
override fun canCreateExplosion(player: Player, location: Location): Boolean {
return true;
return true
}
override fun canPlaceBlock(player: Player, block: Block): Boolean {
return true;
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)
is Player -> ((!api.hasProtection(victim) && api.hasPvPEnabled(victim)) || api.isInCombat(victim))
else -> true
}
}

View File

@@ -9,12 +9,12 @@ 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 {
val api = IridiumSkyblockAPI.getInstance() ?: return true
return api.getIslandPermission(api.getIslandViaLocation(block.location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_BREAK)
}
@@ -22,6 +22,8 @@ class AntigriefIridiumSkyblock : AntigriefWrapper {
player: Player,
location: Location
): Boolean {
val api = IridiumSkyblockAPI.getInstance() ?: return true
return api.getIslandPermission(api.getIslandViaLocation(location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_BREAK)
}
@@ -29,6 +31,8 @@ class AntigriefIridiumSkyblock : AntigriefWrapper {
player: Player,
block: Block
): Boolean {
val api = IridiumSkyblockAPI.getInstance() ?: return true
return api.getIslandPermission(api.getIslandViaLocation(block.location).orElse(null) ?: return true, api.getUser(player), PermissionType.BLOCK_PLACE)
}
@@ -36,6 +40,8 @@ class AntigriefIridiumSkyblock : AntigriefWrapper {
player: Player,
victim: LivingEntity
): Boolean {
val api = IridiumSkyblockAPI.getInstance() ?: return true
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)

View File

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

View File

@@ -17,24 +17,32 @@ class AntigriefSuperiorSkyblock2 : AntigriefWrapper {
}
override fun canBreakBlock(player: Player, block: Block): Boolean {
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) return true
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) {
return true
}
return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("Break"))
|| SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("BREAK"))
}
override fun canCreateExplosion(player: Player, location: Location): Boolean {
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) return true
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) {
return true
}
return SuperiorSkyblockAPI.getIslandAt(location)?.isMember(SuperiorSkyblockAPI.getPlayer(player)) ?: true
}
override fun canPlaceBlock(player: Player, block: Block): Boolean {
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) return true
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) {
return true
}
return SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("Place"))
|| SuperiorSkyblockAPI.getPlayer(player).hasPermission(IslandPrivilege.getByName("PLACE"))
}
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) return true
if (SuperiorSkyblockAPI.getPlayer(player).hasBypassModeEnabled()) {
return true
}
return when (victim) {
is Player -> SuperiorSkyblockAPI.getPlayer(player).canHit(SuperiorSkyblockAPI.getPlayer(victim)).equals(HitActionResult.SUCCESS)
is Animals -> {

View File

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

View File

@@ -1,2 +1,2 @@
version = 6.13.2
version = 6.13.8
plugin-name = eco