Compare commits

..

73 Commits

Author SHA1 Message Date
Auxilor
ad3f7e529d Merge branch 'develop' 2021-11-15 21:03:06 +00:00
Auxilor
ec6ac88fea Remap changes, moved Paste to paste.willfp.com 2021-11-15 20:31:21 +00:00
Auxilor
13b10c13b3 Exposed changes 2021-11-15 20:27:02 +00:00
Auxilor
1e24cbf67b Fixed FastItemStack#hashCode bug 2021-11-15 20:19:55 +00:00
Auxilor
d9cfc8b91a Removed second ./gradlew build in java-ci 2021-11-15 20:14:55 +00:00
Auxilor
b40001d79b Updated to 6.13.10 2021-11-15 20:13:49 +00:00
Auxilor
b8128ef87e Fixed item picker bug with FastItemStack 2021-11-15 20:13:19 +00:00
Auxilor
be885e9092 Updated exposed 2021-11-15 20:11:51 +00:00
Auxilor
5658c92d3d Switched from special gradle to paperweight 2021-11-15 20:10:02 +00:00
Auxilor
e4b0a602f0 Gradle changes 2021-11-15 18:04:00 +00:00
Will FP
bf5c36d2c9 Update README.md 2021-11-15 12:24:32 +00:00
Will FP
cc57d10a36 Update README.md 2021-11-15 12:23:10 +00:00
Auxilor
dcbdbb5230 More Java CI changes 2021-11-15 12:14:06 +00:00
Auxilor
de19d67275 More Java CI changes 2021-11-15 12:05:49 +00:00
Will FP
43abfcb3fc Update README.md 2021-11-15 11:32:54 +00:00
Will FP
34f201d62d Update README.md 2021-11-15 11:32:42 +00:00
Auxilor
d3c811614f Improved java CI 2021-11-15 11:26:47 +00:00
Auxilor
44da61daaa Merge remote-tracking branch 'origin/master' into develop 2021-11-15 11:17:28 +00:00
Auxilor
3ea6d11026 Updated java ci 2021-11-15 11:12:20 +00:00
Auxilor
9a03a2e47a Added Java CI workflow 2021-11-15 11:11:21 +00:00
Auxilor
af91c9d659 Updated to 6.13.9 2021-11-14 13:43:29 +00:00
Auxilor
89eaaf3a5e Updated annotations and jupiter 2021-11-14 13:43:00 +00:00
Auxilor
ab174e2d41 Added configurability to MySQL threads 2021-11-14 13:42:24 +00:00
Auxilor
cfa9badc1e Limited SQL threads to 2 for socket connection limit 2021-11-14 13:41:11 +00:00
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
102 changed files with 1523 additions and 811 deletions

36
.github/workflows/java-ci.yml vendored Normal file
View File

@@ -0,0 +1,36 @@
name: Java CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout latest code
uses: actions/checkout@v2
- name: Set outputs
id: vars
run: echo "::set-output name=sha_short::$(git rev-parse --short HEAD)"
- name: Set up JDK 16
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: 16
- name: Setup build cache
uses: actions/cache@v2.1.6
with:
path: ~/.gradle/caches
key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle.kts') }}
restore-keys: |
${{ runner.os }}-gradle-
- run: ./gradlew build
- uses: actions/upload-artifact@v2
with:
name: eco-dev-${{ steps.vars.outputs.sha_short }}
path: build/libs

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.

131
README.md
View File

@@ -1,22 +1,45 @@
<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>
<a href="https://github.com/Auxilor/eco/actions/workflows/java-ci.yml" alt"Latest Dev Build">
<img src="https://img.shields.io/github/workflow/status/Auxilor/eco/Java%20CI/develop?color=informational"/>
</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">
## Downloads
# Information for development
- Stable (Recommended): [GitHub](https://github.com/Auxilor/eco/releases), [Polymart](https://polymart.org/resource/eco.773)
- Dev (Not Recommended): [GitHub](https://github.com/Auxilor/eco/actions/workflows/java-ci.yml) (Open latest run and download)
# 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
@@ -28,12 +51,6 @@ depend:
- eco
```
eco is available from any of these places:
- [GitHub](https://github.com/Auxilor/eco/releases)
- [Polymart](https://polymart.org/resource/eco.773)
- [Build it locally](https://github.com/Auxilor/eco#build-locally).
## Get from JitPack:
Gradle:
@@ -51,7 +68,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 +88,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 +101,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

@@ -11,7 +11,7 @@ dependencies {
implementation project(":eco-core:core-proxy")
implementation project(":eco-core:core-backend")
implementation project(":eco-core:core-nms:v1_16_R3")
implementation project(path: ":eco-core:core-nms:v1_17_R1", configuration: 'mapped')
implementation project(path: ":eco-core:core-nms:v1_17_R1", configuration: "reobf")
}
allprojects {
@@ -57,22 +57,13 @@ 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'
compileOnly 'org.jetbrains:annotations:23.0.0'
// Test
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
testImplementation 'org.junit.jupiter:junit-jupiter-api:5.8.1'
testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.8.1'
}

View File

@@ -16,7 +16,7 @@ dependencies {
// Other
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly 'org.apache.maven:maven-artifact:3.8.1'
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.1-SNAPSHOT'
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
compileOnly 'com.google.code.gson:gson:2.8.8'
}

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;
/**
@@ -48,7 +46,7 @@ public class Paste {
byte[] postData = contents.getBytes(StandardCharsets.UTF_8);
int postDataLength = postData.length;
String requestURL = "https://hastebin.com/documents";
String requestURL = "https://paste.willfp.com/documents";
URL url = new URL(requestURL);
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setDoOutput(true);
@@ -88,7 +86,7 @@ public class Paste {
public static Paste getFromHastebin(@NotNull final String token) {
try {
StringBuilder result = new StringBuilder();
URL url = new URL("https://hastebin.com/raw/" + token);
URL url = new URL("https://paste.willfp.com/raw/" + token);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");
try (var reader = new BufferedReader(
@@ -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

@@ -2,7 +2,13 @@ package com.willfp.eco.proxy.v1_16_R3.fast
import com.willfp.eco.internal.fast.EcoFastItemStack
import com.willfp.eco.util.StringUtils
import net.minecraft.server.v1_16_R3.*
import net.minecraft.server.v1_16_R3.Item
import net.minecraft.server.v1_16_R3.ItemEnchantedBook
import net.minecraft.server.v1_16_R3.ItemStack
import net.minecraft.server.v1_16_R3.Items
import net.minecraft.server.v1_16_R3.NBTTagCompound
import net.minecraft.server.v1_16_R3.NBTTagList
import net.minecraft.server.v1_16_R3.NBTTagString
import org.bukkit.craftbukkit.v1_16_R3.inventory.CraftItemStack
import org.bukkit.craftbukkit.v1_16_R3.util.CraftMagicNumbers
import org.bukkit.craftbukkit.v1_16_R3.util.CraftNamespacedKey
@@ -82,7 +88,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
}
private fun getLoreJSON(): List<String> {
val displayTag = handle.a("display")
val displayTag = handle.b("display") ?: return emptyList()
return if (displayTag.hasKey("Lore")) {
val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING)
val lore: MutableList<String> = ArrayList(loreTag.size)
@@ -91,7 +97,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
}
lore
} else {
ArrayList()
emptyList()
}
}
@@ -159,7 +165,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
}
override fun hashCode(): Int {
return handle.tag.hashCode() * 31 + Item.getId(handle.item)
return handle.tag?.hashCode() ?: 0b00010101 * 31 + Item.getId(handle.item)
}
private fun apply() {

View File

@@ -1,31 +0,0 @@
plugins {
id 'xyz.jpenilla.special-gradle' version '1.0.0-SNAPSHOT'
}
group 'com.willfp'
version rootProject.version
dependencies {
compileOnly 'org.spigotmc:spigot:1.17.1-R0.1-SNAPSHOT:remapped-mojang'
compileOnly 'net.kyori:adventure-api:4.9.1'
compileOnly 'net.kyori:adventure-text-serializer-gson:4.8.1'
}
specialGradle {
minecraftVersion.set("1.17")
specialSourceVersion.set("1.10.0")
}
buildTools {
quiet.set(true);
}
configurations.create('mapped')
artifacts {
mapped jar.outputs.files.files.toArray()[0]
}
productionMappedJar.mustRunAfter(clean)
productionMappedJar.mustRunAfter(compileKotlin)
build.dependsOn productionMappedJar

View File

@@ -0,0 +1,18 @@
plugins {
id("io.papermc.paperweight.userdev") version "1.1.14"
}
group = "com.willfp"
version = rootProject.version
dependencies {
paperDevBundle("1.17.1-R0.1-SNAPSHOT")
compileOnly("net.kyori:adventure-api:4.9.1")
compileOnly("net.kyori:adventure-text-serializer-gson:4.8.1")
}
tasks {
build {
dependsOn(reobfJar)
}
}

View File

@@ -101,7 +101,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
}
private fun getLoreJSON(): List<String> {
val displayTag = handle.getOrCreateTagElement("display")
val displayTag = handle.getTagElement("display") ?: return emptyList()
return if (displayTag.contains("Lore")) {
val loreTag = displayTag.getList("Lore", CraftMagicNumbers.NBT.TAG_STRING)
val lore: MutableList<String> = ArrayList(loreTag.size)
@@ -112,7 +112,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
lore
} else {
ArrayList()
emptyList()
}
}
@@ -180,7 +180,7 @@ class NMSFastItemStack(itemStack: org.bukkit.inventory.ItemStack) : EcoFastItemS
}
override fun hashCode(): Int {
return handle.tag.hashCode() * 31 + Item.getId(handle.item)
return handle.tag?.hashCode() ?: 0b00010101 * 31 + Item.getId(handle.item)
}
private fun apply() {

View File

@@ -15,7 +15,7 @@ dependencies {
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
compileOnly project(":eco-core:core-proxy")
compileOnly project(":eco-core:core-backend")
compileOnly 'com.comphenix.protocol:ProtocolLib:4.7.1-SNAPSHOT'
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.1-SNAPSHOT'
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.7-SNAPSHOT'
compileOnly 'com.github.TechFortress:GriefPrevention:16.17.1'
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
@@ -30,9 +30,9 @@ dependencies {
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
compileOnly 'com.arcaniax:HeadDatabase-API:1.3.0'
compileOnly 'org.jetbrains.exposed:exposed-core:0.35.1'
compileOnly 'org.jetbrains.exposed:exposed-dao:0.35.1'
compileOnly 'org.jetbrains.exposed:exposed-jdbc:0.35.1'
compileOnly 'org.jetbrains.exposed:exposed-core:0.36.2'
compileOnly 'org.jetbrains.exposed:exposed-dao:0.36.2'
compileOnly 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
compileOnly 'mysql:mysql-connector-java:8.0.25'
compileOnly 'com.gmail.filoghost.holographicdisplays:holographicdisplays-api:2.4.0'
compileOnly 'net.essentialsx:EssentialsX:2.19.0'
@@ -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

@@ -16,13 +16,10 @@ 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.transactions.transaction
import org.jetbrains.exposed.sql.update
import java.util.UUID
@@ -34,7 +31,7 @@ class MySQLDataHandler(
) : DataHandler {
private val columns = mutableMapOf<String, Column<*>>()
private val threadFactory = ThreadFactoryBuilder().setNameFormat("eco-mysql-thread-%d").build()
private val executor = Executors.newCachedThreadPool(threadFactory)
private val executor = Executors.newFixedThreadPool(plugin.configYml.getInt("mysql.threads"), threadFactory)
init {
Database.connect(
@@ -52,13 +49,17 @@ class MySQLDataHandler(
}
// Get Exposed to shut the hell up
exposedLogger::class.java.getDeclaredField("logger").apply { isAccessible = true }
.apply {
get(exposedLogger).apply {
this.javaClass.getDeclaredMethod("setLevel", Level::class.java)
.invoke(this, Level.OFF)
try {
exposedLogger::class.java.getDeclaredField("logger").apply { isAccessible = true }
.apply {
get(exposedLogger).apply {
this.javaClass.getDeclaredMethod("setLevel", Level::class.java)
.invoke(this, Level.OFF)
}
}
}
} catch (e: Exception) {
Eco.getHandler().ecoPlugin.logger.warning("Failed to silence Exposed logger! You might get some console spam")
}
}
override fun updateKeys() {
@@ -67,7 +68,7 @@ class MySQLDataHandler(
registerColumn(key, Players)
}
SchemaUtils.createMissingTablesAndColumns(Players)
SchemaUtils.createMissingTablesAndColumns(Players, withLogs = false)
}
}
@@ -76,26 +77,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 +99,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 +119,7 @@ class MySQLDataHandler(
val player = getPlayer(uuid)
value = player[getColumn(key.toString())] as T?
}
return value
}
@@ -178,27 +170,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

@@ -5,17 +5,16 @@
mysql:
enabled: false # Set to false, data.yml will be used instead.
# How many threads to execute statements on. Higher numbers can be faster however
# very high numbers can cause issues with OS configuration. If writes are taking
# too long, increase this value.
threads: 2
host: localhost
port: 3306
database: database
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 +47,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

@@ -45,8 +45,8 @@ libraries:
- 'net.kyori:adventure-text-serializer-gson:4.9.2'
- 'net.kyori:adventure-text-serializer-legacy:4.9.2'
- 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'
- 'org.jetbrains.exposed:exposed-core:0.35.1'
- 'org.jetbrains.exposed:exposed-dao:0.35.1'
- 'org.jetbrains.exposed:exposed-jdbc:0.35.1'
- 'org.jetbrains.exposed:exposed-core:0.36.2'
- 'org.jetbrains.exposed:exposed-dao:0.36.2'
- 'org.jetbrains.exposed:exposed-jdbc:0.36.2'
- 'mysql:mysql-connector-java:8.0.25'
- 'com.google.guava:guava:31.0.1-jre'

View File

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

Binary file not shown.

View File

@@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.0.2-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-7.3-bin.zip
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists

2
gradlew vendored
View File

@@ -130,7 +130,7 @@ fi
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath

Some files were not shown because too many files have changed in this diff Show More