Compare commits

..

73 Commits

Author SHA1 Message Date
Auxilor
c1b673e30c Fixed config.yml bug 2021-12-14 08:51:33 +00:00
Auxilor
4cf45795d6 Clarified forRemoval 2021-12-14 08:40:58 +00:00
Auxilor
59d31584e6 Generalized ConfigYml into LoadableConfig for custom implementations 2021-12-14 08:38:51 +00:00
Auxilor
68e1f4afac Added piston moving / retracting support to BlockUtils#isPlayerPlaced 2021-12-14 08:30:34 +00:00
Auxilor
507fad186a Improved PlayerJumpEvent on paper 2021-12-13 13:00:05 +00:00
Auxilor
ca6b3185a3 Fixed legacy configs not having 100% parity 2021-12-13 12:56:22 +00:00
Auxilor
8e96329fdc Fixed ConfigWrapper constructor access 2021-12-13 12:24:12 +00:00
Auxilor
440605f636 Re-made ConfigWrapper abstract 2021-12-13 12:24:01 +00:00
Auxilor
bb686dca17 Config refactor 2021-12-13 12:23:41 +00:00
Auxilor
e595ea2247 Marked AbstractProxy for removal 2021-12-13 12:09:58 +00:00
Auxilor
a776b60f86 Deprecated AbstractProxy 2021-12-13 12:05:49 +00:00
Auxilor
db7ac55eb2 Minor codestyle changes 2021-12-13 11:49:46 +00:00
Auxilor
52d77d7861 Added TestableItem support to ItemStackBuilder 2021-12-13 11:43:36 +00:00
Auxilor
f8ece2d6c7 @NotNull to Handler#getPlayerProfileHandler 2021-12-13 11:35:46 +00:00
Auxilor
b353b5ec04 More javadoc 2021-12-13 10:45:33 +00:00
Auxilor
bbc412e589 Added ListUtils#getOrNull 2021-12-13 10:08:46 +00:00
Auxilor
b4a474c703 Integration / Scheduling changes 2021-12-13 09:59:33 +00:00
Auxilor
75e6a3da79 Documentation and visibility changes 2021-12-13 09:54:39 +00:00
Auxilor
a1afffdbbb Added since to deprecation 2021-12-13 09:35:55 +00:00
Auxilor
f6942192de Added since to deprecation 2021-12-12 15:52:39 +00:00
Auxilor
dab26cbe95 Deprecation changes and warnings 2021-12-12 15:47:46 +00:00
Auxilor
b945a3f948 Improved deprecation javadoc 2021-12-12 15:43:25 +00:00
Auxilor
b2c1d650de Removed DeprecatedIsStillUsed suppressions 2021-12-12 14:21:23 +00:00
Auxilor
4b994d5f4c Fixed javadoc 2021-12-12 14:04:53 +00:00
Auxilor
ed2dffb52c Fixed internal use of YamlBaseConfig 2021-12-12 14:04:21 +00:00
Auxilor
20c870da06 Fixed internal use of deprecated config class 2021-12-12 14:01:28 +00:00
Auxilor
7684e431f5 Even more config parity fixes 2021-12-12 13:58:53 +00:00
Auxilor
abcc13685f Fixed config parity bugs 2021-12-12 13:55:15 +00:00
Auxilor
ac902eaa08 Overhauled config system 2021-12-12 13:44:58 +00:00
Auxilor
4e52913504 Javadoc 2021-12-12 12:47:37 +00:00
Auxilor
7505f7732f Merge remote-tracking branch 'origin/dependabot/gradle/com.github.johnrengelman.shadow-7.1.0' into develop 2021-12-12 12:43:40 +00:00
Auxilor
15fae21fd5 Merge remote-tracking branch 'origin/dependabot/gradle/com.massivecraft-Factions-1.6.9.5-2.7.0-STABLE' into develop 2021-12-12 12:43:36 +00:00
Auxilor
e9d98816ce Merge remote-tracking branch 'origin/dependabot/gradle/org.junit.jupiter-junit-jupiter-api-5.8.2' into develop
# Conflicts:
#	build.gradle.kts
2021-12-12 12:43:32 +00:00
Auxilor
675fc07ebf Merge remote-tracking branch 'origin/dependabot/gradle/org.junit.jupiter-junit-jupiter-engine-5.8.2' into develop 2021-12-12 12:43:11 +00:00
Auxilor
b8b8fd70b5 Javadoc 2021-12-12 12:42:16 +00:00
Auxilor
1d9fca1fb8 Added permissions to recipes 2021-12-12 12:38:04 +00:00
Auxilor
9b83f6eab4 Added ListUtils#toSingletonList 2021-12-12 12:17:45 +00:00
Auxilor
8190660b8f Removed redundant suppression 2021-12-12 12:14:50 +00:00
Auxilor
cbf4d111fb More dev niceties 2021-12-12 12:14:24 +00:00
Auxilor
6a139bef67 Kotlin-friendliness 2021-12-12 12:09:12 +00:00
Auxilor
9e3fecfd13 Updated to 6.17.0 2021-12-12 12:00:20 +00:00
Auxilor
3b260e2e5d Improved command system 2021-12-12 12:00:09 +00:00
Auxilor
0c0370e256 Updated to 6.16.2 2021-12-08 20:47:22 +00:00
Auxilor
227b748f85 Fixed bStats issues 2021-12-08 20:46:26 +00:00
Auxilor
c8382bd8cf Updated to 6.16.1 2021-12-08 20:40:59 +00:00
Auxilor
df22768367 Fixed bugs 2021-12-08 20:40:39 +00:00
Auxilor
00ea3506ca config.yml changes 2021-12-08 20:32:55 +00:00
Auxilor
521659cfec bStats changes 2021-12-08 20:32:31 +00:00
Auxilor
bbe5f1eba4 Merge remote-tracking branch 'origin/develop' into develop
# Conflicts:
#	eco-core/core-plugin/build.gradle
2021-12-08 20:24:07 +00:00
dependabot[bot]
3d4c33860a Bump junit-jupiter-engine from 5.8.1 to 5.8.2
Bumps [junit-jupiter-engine](https://github.com/junit-team/junit5) from 5.8.1 to 5.8.2.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-engine
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-12-08 20:18:37 +00:00
Auxilor
eae5d29f8d Downgraded bStats 2021-12-08 20:16:59 +00:00
Auxilor
c878d6fd12 Implemented stipped-down bStats directly (recoded in kotlin) 2021-12-08 16:08:03 +00:00
Auxilor
2b97c0072f Downgraded bStats 2021-12-08 14:18:24 +00:00
Auxilor
63079df745 Removed explicit buffer size 2021-12-08 12:41:24 +00:00
Auxilor
079b41e877 Switched to old config behavior 2021-12-08 12:40:13 +00:00
Auxilor
1aaab459d8 Updated bStats to 2.2.1 2021-12-08 12:34:38 +00:00
Auxilor
db78c2eb4c Fixed javadoc + codestyle 2021-12-08 12:22:51 +00:00
Auxilor
02fd07b3c8 Fixed shadowed name 2021-12-08 12:17:22 +00:00
Auxilor
3de2e53031 Fixed default captive items bug 2021-12-08 11:27:33 +00:00
Auxilor
cb088bb70b Allowed specifiying default captive items 2021-12-08 11:23:23 +00:00
Auxilor
36fca7016f Fixed ArgParserEnchantment never returning null 2021-12-08 11:11:59 +00:00
Auxilor
7e1137da06 Cleaned up SS2 integration 2021-12-08 10:53:16 +00:00
Auxilor
0da104d614 Added color:#fffff support x 2021-12-08 10:51:25 +00:00
Auxilor
9095de7d19 Updated to 6.16.0 2021-12-08 10:50:36 +00:00
Auxilor
7a8abac1a2 Pull Request Fixes / Changes, config changes 2021-12-08 10:50:12 +00:00
0ft3n
1ddcb6e964 Merge branch 'master' into master 2021-12-07 14:11:40 +03:00
_OfTeN_
4d0858ad84 Added AntigriefManager#canPickupItem and created and implemented DropQueuePushEvent event 2021-12-07 14:08:04 +03:00
_OfTeN_
3d05695a36 Added Items#getItem 2021-12-07 13:30:36 +03:00
_OfTeN_
3a9f5bc139 Added support for DecentHolograms 2021-12-03 21:10:40 +03:00
_OfTeN_
03ae9e89b3 Added color:#FFFFFF, color:FFFFFF or color:red,green,blue parser for leather armor color 2021-12-02 23:26:38 +03:00
dependabot[bot]
651426ed76 Bump junit-jupiter-api from 5.8.1 to 5.8.2
Bumps [junit-jupiter-api](https://github.com/junit-team/junit5) from 5.8.1 to 5.8.2.
- [Release notes](https://github.com/junit-team/junit5/releases)
- [Commits](https://github.com/junit-team/junit5/compare/r5.8.1...r5.8.2)

---
updated-dependencies:
- dependency-name: org.junit.jupiter:junit-jupiter-api
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-30 19:41:43 +00:00
dependabot[bot]
1a49165656 Bump com.github.johnrengelman.shadow from 7.0.0 to 7.1.0
Bumps com.github.johnrengelman.shadow from 7.0.0 to 7.1.0.

---
updated-dependencies:
- dependency-name: com.github.johnrengelman.shadow
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-26 19:13:10 +00:00
dependabot[bot]
a48c3c2fed Bump Factions from 1.6.9.5-U0.5.10 to 1.6.9.5-2.7.0-STABLE
Bumps Factions from 1.6.9.5-U0.5.10 to 1.6.9.5-2.7.0-STABLE.

---
updated-dependencies:
- dependency-name: com.massivecraft:Factions
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
2021-11-15 21:04:02 +00:00
120 changed files with 1883 additions and 460 deletions

View File

@@ -1,6 +1,6 @@
plugins { plugins {
id("java-library") id("java-library")
id("com.github.johnrengelman.shadow") version "7.0.0" id("com.github.johnrengelman.shadow") version "7.1.0"
id("maven-publish") id("maven-publish")
id("java") id("java")
} }
@@ -35,7 +35,7 @@ allprojects {
// NMS (for jitpack compilation) // NMS (for jitpack compilation)
maven("https://repo.codemc.org/repository/nms/") maven("https://repo.codemc.org/repository/nms/")
// bStats, mcMMO, BentoBox // mcMMO, BentoBox
maven("https://repo.codemc.org/repository/maven-public/") maven("https://repo.codemc.org/repository/maven-public/")
// Spigot API, Bungee API // Spigot API, Bungee API
@@ -68,7 +68,7 @@ allprojects {
// Test // Test
testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1") testImplementation("org.junit.jupiter:junit-jupiter-api:5.8.1")
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.1") testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine:5.8.2")
// Adventure // Adventure
compileOnly("net.kyori:adventure-api:4.9.3") compileOnly("net.kyori:adventure-api:4.9.3")

View File

@@ -5,10 +5,13 @@ import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Base class to hold the handler. * Holds the instance of the eco handler for bridging between the frontend
* and backend.
* *
* @see Eco#getHandler()
* @see Handler * @see Handler
*/ */
@ApiStatus.Internal
public final class Eco { public final class Eco {
/** /**
* Instance of eco handler. * Instance of eco handler.
@@ -18,6 +21,7 @@ public final class Eco {
/** /**
* Set the handler. * Set the handler.
*
* @param handler The handler. * @param handler The handler.
*/ */
@ApiStatus.Internal @ApiStatus.Internal
@@ -28,18 +32,18 @@ public final class Eco {
} }
/** /**
* Get the instance of the eco handler. * Get the instance of the eco handler; the bridge between the api frontend
* and the implementation backend.
* <p> * <p>
* The handler is, in essence, a way to interface between the eco-api * <strong>Do not use the handler in your plugins!</strong> It can and will contain
* frontend module, and the eco-backend implementations. * breaking changes between minor versions and even patches, and you will create
* compatibility issues by using the handler. All parts of the handler have been abstracted
* into logically named API components that you can use.
* <p> * <p>
* There shouldn't really be any reason to ever use the handler * Prior to version 6.12.0, the handler was considered as an API component, but it has
* in your own plugins, and you are likely to break things. All parts of * since been moved into an internal component, and in 6.17.0, the first breaking change
* the handler are abstracted into logically named parts of the API. * was introduced to {@link com.willfp.eco.core.config.wrapper.ConfigFactory}. This means
* <p> * that any usages of the handler can now cause problems in your plugins.
* In versions of eco before 6.12.0, the handler was considered part of
* the eco API, however it has since been moved into an internal component
* that shouldn't be used in your plugins.
* *
* @return The handler. * @return The handler.
*/ */

View File

@@ -14,7 +14,6 @@ import com.willfp.eco.core.factory.NamespacedKeyFactory;
import com.willfp.eco.core.factory.RunnableFactory; import com.willfp.eco.core.factory.RunnableFactory;
import com.willfp.eco.core.integrations.IntegrationLoader; import com.willfp.eco.core.integrations.IntegrationLoader;
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager; import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
import com.willfp.eco.core.proxy.AbstractProxy;
import com.willfp.eco.core.proxy.ProxyFactory; import com.willfp.eco.core.proxy.ProxyFactory;
import com.willfp.eco.core.scheduling.Scheduler; import com.willfp.eco.core.scheduling.Scheduler;
import com.willfp.eco.core.web.UpdateChecker; import com.willfp.eco.core.web.UpdateChecker;
@@ -32,6 +31,7 @@ import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Objects;
import java.util.Set; import java.util.Set;
import java.util.logging.Logger; import java.util.logging.Logger;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -636,7 +636,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
* @param <T> The proxy type. * @param <T> The proxy type.
* @return The proxy. * @return The proxy.
*/ */
public final <T extends AbstractProxy> T getProxy(@NotNull final Class<T> proxyClass) { public final <T> T getProxy(@NotNull final Class<T> proxyClass) {
Validate.notNull(proxyFactory, "Plugin does not support proxy!"); Validate.notNull(proxyFactory, "Plugin does not support proxy!");
return proxyFactory.getProxy(proxyClass); return proxyFactory.getProxy(proxyClass);
@@ -655,7 +655,7 @@ public abstract class EcoPlugin extends JavaPlugin implements PluginLike {
public final FileConfiguration getConfig() { public final FileConfiguration getConfig() {
this.getLogger().warning("Call to default config method in eco plugin!"); this.getLogger().warning("Call to default config method in eco plugin!");
return this.getConfigYml().getBukkitHandle(); return Objects.requireNonNull(this.getConfigYml().getBukkitHandle());
} }
/** /**

View File

@@ -230,5 +230,6 @@ public interface Handler {
* *
* @return The handler. * @return The handler.
*/ */
@NotNull
PlayerProfileHandler getPlayerProfileHandler(); PlayerProfileHandler getPlayerProfileHandler();
} }

View File

@@ -4,6 +4,13 @@ import org.jetbrains.annotations.NotNull;
/** /**
* Quick DI class to manage passing eco plugins. * Quick DI class to manage passing eco plugins.
* <p>
* Basically just a quick bit of laziness if you can't be bothered to add a private field
* and a protected getter, don't use this in kotlin as you can just specify
* {@code
* private val plugin: EcoPlugin
* }
* in the constructor.
* *
* @param <T> The eco plugin type. * @param <T> The eco plugin type.
*/ */

View File

@@ -3,6 +3,7 @@ package com.willfp.eco.core;
import com.willfp.eco.core.config.updating.ConfigHandler; import com.willfp.eco.core.config.updating.ConfigHandler;
import java.io.File; import java.io.File;
import java.util.logging.Logger;
/** /**
* Represents any class that acts like a plugin, for example {@link EcoPlugin} * Represents any class that acts like a plugin, for example {@link EcoPlugin}
@@ -26,4 +27,11 @@ public interface PluginLike {
* @return The config handler. * @return The config handler.
*/ */
ConfigHandler getConfigHandler(); ConfigHandler getConfigHandler();
/**
* Get the logger.
*
* @return The logger.
*/
Logger getLogger();
} }

View File

@@ -1,7 +1,11 @@
package com.willfp.eco.core.command; package com.willfp.eco.core.command;
import org.bukkit.command.CommandSender;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.ArrayList;
import java.util.List;
/** /**
* Interface for all command implementations. * Interface for all command implementations.
*/ */
@@ -35,31 +39,70 @@ public interface CommandBase {
*/ */
CommandBase addSubcommand(@NotNull CommandBase command); CommandBase addSubcommand(@NotNull CommandBase command);
/**
* Handle command execution.
* <p>
* Marked as default void with no implementation for backwards compatibility.
*
* @param sender The sender.
* @param args The args.
*/
default void onExecute(@NotNull CommandSender sender,
@NotNull List<String> args) {
// Do nothing.
}
/**
* Handle tab completion.
* <p>
* Marked as default void with no implementation for backwards compatibility.
*
* @param sender The sender.
* @param args The args.
* @return The results.
*/
default List<String> tabComplete(@NotNull CommandSender sender,
@NotNull List<String> args) {
return new ArrayList<>();
}
/** /**
* Get the handler. * Get the handler.
* *
* @return The handler. * @return The handler.
* @see CommandHandler
* @deprecated Use {@link CommandBase#onExecute(CommandSender, List)} instead.
*/ */
@Deprecated
CommandHandler getHandler(); CommandHandler getHandler();
/** /**
* Set the handler. * Set the handler.
* *
* @param handler The handler. * @param handler The handler.
* @see CommandHandler
* @deprecated Handlers have been deprecated.
*/ */
@Deprecated
void setHandler(@NotNull CommandHandler handler); void setHandler(@NotNull CommandHandler handler);
/** /**
* Get the tab completer. * Get the tab completer.
* *
* @return The tab completer. * @return The tab completer.
* @see TabCompleteHandler
* @deprecated Use {@link CommandBase#tabComplete(CommandSender, List)} instead.
*/ */
@Deprecated
TabCompleteHandler getTabCompleter(); TabCompleteHandler getTabCompleter();
/** /**
* Set the tab completer. * Set the tab completer.
* *
* @param handler The handler. * @param handler The handler.
* @see TabCompleteHandler
* @deprecated Handlers have been deprecated.
*/ */
@Deprecated
void setTabCompleter(@NotNull TabCompleteHandler handler); void setTabCompleter(@NotNull TabCompleteHandler handler);
} }

View File

@@ -10,9 +10,13 @@ import java.util.List;
* A command handler handles the actual code for a command. * A command handler handles the actual code for a command.
* <p> * <p>
* The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])} * The replacement for {@link org.bukkit.command.CommandExecutor#onCommand(CommandSender, Command, String, String[])}
*
* @see CommandBase * @see CommandBase
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
* update to use the new system: {@link CommandBase#onExecute(CommandSender, List)}.
*/ */
@FunctionalInterface @FunctionalInterface
@Deprecated(since = "6.17.0")
public interface CommandHandler { public interface CommandHandler {
/** /**
* The code to be called on execution. * The code to be called on execution.

View File

@@ -10,9 +10,13 @@ import java.util.List;
* A Tab Complete handler handles the actual tab-completion code. * A Tab Complete handler handles the actual tab-completion code.
* <p> * <p>
* The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])} * The replacement for {@link org.bukkit.command.TabCompleter#onTabComplete(CommandSender, Command, String, String[])}
*
* @see CommandBase * @see CommandBase
* @deprecated Handlers have been deprecated. This legacy system will eventually be removed,
* update to use the new system: {@link CommandBase#tabComplete(CommandSender, List)}
*/ */
@FunctionalInterface @FunctionalInterface
@Deprecated(since = "6.17.0")
public interface TabCompleteHandler { public interface TabCompleteHandler {
/** /**
* Handle Tab Completion. * Handle Tab Completion.

View File

@@ -9,6 +9,7 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.util.StringUtil; import org.bukkit.util.StringUtil;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -23,6 +24,7 @@ import java.util.stream.Collectors;
* in order to execute the command-specific code. It's essentially an internal * in order to execute the command-specific code. It's essentially an internal
* layer, hence why it's a package-private class. * layer, hence why it's a package-private class.
*/ */
@SuppressWarnings({"DeprecatedIsStillUsed"})
abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase { abstract class HandledCommand extends PluginDependent<EcoPlugin> implements CommandBase {
/** /**
* The name of the command. * The name of the command.
@@ -46,14 +48,16 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
/** /**
* The actual code to be executed in the command. * The actual code to be executed in the command.
*/ */
private CommandHandler handler = (sender, args) -> { @Deprecated
// Do nothing by default @Nullable
}; private CommandHandler handler = null;
/** /**
* The tab completion code to be executed in the command. * The tab completion code to be executed in the command.
*/ */
private TabCompleteHandler tabCompleter = (sender, args) -> new ArrayList<>(); @Deprecated
@Nullable
private TabCompleteHandler tabCompleter = null;
/** /**
* All subcommands for the command. * All subcommands for the command.
@@ -120,7 +124,11 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
} }
} }
this.getHandler().onExecute(sender, Arrays.asList(args)); if (this.getHandler() != null) {
this.getHandler().onExecute(sender, Arrays.asList(args));
} else {
this.onExecute(sender, Arrays.asList(args));
}
} }
/** /**
@@ -167,7 +175,11 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
} }
} }
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args)); if (this.getTabCompleter() != null) {
return this.getTabCompleter().tabComplete(sender, Arrays.asList(args));
} else {
return this.tabComplete(sender, Arrays.asList(args));
}
} }
/** /**
@@ -221,24 +233,6 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
return this.playersOnly; 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. * Get the subcommands of the command.
* *
@@ -248,21 +242,27 @@ abstract class HandledCommand extends PluginDependent<EcoPlugin> implements Comm
return this.subcommands; return this.subcommands;
} }
/** @Deprecated
* Set the command handler. @Override
* public @Nullable CommandHandler getHandler() {
* @param handler The handler. return this.handler;
*/ }
public void setHandler(@NotNull final CommandHandler handler) {
@Deprecated
@Override
public @Nullable TabCompleteHandler getTabCompleter() {
return this.tabCompleter;
}
@Deprecated
@Override
public void setHandler(@Nullable final CommandHandler handler) {
this.handler = handler; this.handler = handler;
} }
/** @Deprecated
* Set the tab completer. @Override
* public void setTabCompleter(@Nullable final TabCompleteHandler tabCompleter) {
* @param tabCompleter The tab completer.
*/
public void setTabCompleter(@NotNull final TabCompleteHandler tabCompleter) {
this.tabCompleter = tabCompleter; this.tabCompleter = tabCompleter;
} }
} }

View File

@@ -12,7 +12,9 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
/** /**
* PluginCommands are the class to be used instead of CommandExecutor. * PluginCommands are the class to be used instead of CommandExecutor,
* they function as the base command, e.g. {@code /ecoenchants} would be a base command, with each
* subsequent argument functioning as subcommands.
* <p> * <p>
* The command will not be registered until register() is called. * The command will not be registered until register() is called.
* <p> * <p>

View File

@@ -0,0 +1,35 @@
package com.willfp.eco.core.config;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
import org.jetbrains.annotations.NotNull;
/**
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
* <p>
* Automatically updates.
*/
public abstract class BaseConfig extends LoadableConfigWrapper {
/**
* Create new Base Config.
*
* @param plugin The plugin or extension.
* @param configName The config name (excluding extension).
* @param removeUnused If unused sections should be removed.
* @param type The config type.
*/
protected BaseConfig(@NotNull final String configName,
@NotNull final PluginLike plugin,
final boolean removeUnused,
@NotNull final ConfigType type) {
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
configName,
plugin,
"",
plugin.getClass(),
removeUnused,
type
));
}
}

View File

@@ -0,0 +1,16 @@
package com.willfp.eco.core.config;
/**
* Config types, classified by file extension.
*/
public enum ConfigType {
/**
* .json config.
*/
JSON,
/**
* .yml config.
*/
YAML
}

View File

@@ -0,0 +1,44 @@
package com.willfp.eco.core.config;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
import org.jetbrains.annotations.NotNull;
/**
* Config implementation for configs present in one of two places:
* <ul>
* <li>Plugin base directory (eg config.yml, lang.json)</li>
* <li>Other extension's configs</li>
* </ul>
* <p>
* Automatically updates.
*/
public abstract class ExtendableConfig extends LoadableConfigWrapper {
/**
* @param configName The name of the config
* @param removeUnused Whether keys not present in the default config should be removed on update.
* @param plugin The plugin.
* @param updateBlacklist Substring of keys to not add/remove keys for.
* @param subDirectoryPath The subdirectory path.
* @param type The config type.
* @param source The class that owns the resource.
*/
protected ExtendableConfig(@NotNull final String configName,
final boolean removeUnused,
@NotNull final PluginLike plugin,
@NotNull final Class<?> source,
@NotNull final String subDirectoryPath,
@NotNull final ConfigType type,
@NotNull final String... updateBlacklist) {
super(Eco.getHandler().getConfigFactory().createUpdatableConfig(
configName,
plugin,
subDirectoryPath,
source,
removeUnused,
type,
updateBlacklist
));
}
}

View File

@@ -0,0 +1,32 @@
package com.willfp.eco.core.config;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.wrapper.LoadableConfigWrapper;
import org.jetbrains.annotations.NotNull;
/**
* Non-updatable yaml config that exists within a plugin jar.
*/
public abstract class StaticBaseConfig extends LoadableConfigWrapper {
/**
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
* <p>
* Does not automatically update.
*
* @param configName The name of the config
* @param plugin The plugin.
* @param type The config type.
*/
protected StaticBaseConfig(@NotNull final String configName,
@NotNull final PluginLike plugin,
@NotNull final ConfigType type) {
super(Eco.getHandler().getConfigFactory().createLoadableConfig(
configName,
plugin,
"",
plugin.getClass(),
type
));
}
}

View File

@@ -0,0 +1,48 @@
package com.willfp.eco.core.config;
import com.willfp.eco.core.Eco;
import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.core.config.wrapper.ConfigWrapper;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import java.util.Map;
/**
* Config that exists purely in the code, not linked to any file.
* <p>
* Use for inline configs to move data around or to add subsections to other configs.
*/
public class TransientConfig extends ConfigWrapper<Config> {
/**
* @param config The YamlConfiguration handle.
*/
public TransientConfig(@NotNull final YamlConfiguration config) {
super(Eco.getHandler().getConfigFactory().createConfig(config));
}
/**
* Create a new empty transient config.
*
* @param values The values.
*/
public TransientConfig(@NotNull final Map<String, Object> values) {
super(Eco.getHandler().getConfigFactory().createConfig(values));
}
/**
* Create a new empty transient config.
*/
public TransientConfig() {
super(Eco.getHandler().getConfigFactory().createConfig("", ConfigType.YAML));
}
/**
* @param contents The contents of the config.
* @param type The config type.
*/
public TransientConfig(@NotNull final String contents,
@NotNull final ConfigType type) {
super(Eco.getHandler().getConfigFactory().createConfig(contents, type));
}
}

View File

@@ -1,20 +1,21 @@
package com.willfp.eco.core.config.base; package com.willfp.eco.core.config.base;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.yaml.YamlBaseConfig; import com.willfp.eco.core.config.BaseConfig;
import com.willfp.eco.core.config.ConfigType;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Default plugin config.yml. * Default plugin config.yml.
*/ */
public class ConfigYml extends YamlBaseConfig { public class ConfigYml extends BaseConfig {
/** /**
* Config.yml. * Config.yml.
* *
* @param plugin The plugin. * @param plugin The plugin.
*/ */
public ConfigYml(@NotNull final EcoPlugin plugin) { public ConfigYml(@NotNull final EcoPlugin plugin) {
super("config", true, plugin); super("config", plugin, true, ConfigType.YAML);
} }
/** /**
@@ -25,7 +26,7 @@ public class ConfigYml extends YamlBaseConfig {
*/ */
public ConfigYml(@NotNull final EcoPlugin plugin, public ConfigYml(@NotNull final EcoPlugin plugin,
final boolean removeUnused) { final boolean removeUnused) {
super("config", removeUnused, plugin); super("config", plugin, removeUnused, ConfigType.YAML);
} }
/** /**
@@ -36,7 +37,7 @@ public class ConfigYml extends YamlBaseConfig {
*/ */
public ConfigYml(@NotNull final EcoPlugin plugin, public ConfigYml(@NotNull final EcoPlugin plugin,
@NotNull final String name) { @NotNull final String name) {
super(name, true, plugin); super(name, plugin, true, ConfigType.YAML);
} }
/** /**
@@ -49,7 +50,6 @@ public class ConfigYml extends YamlBaseConfig {
public ConfigYml(@NotNull final EcoPlugin plugin, public ConfigYml(@NotNull final EcoPlugin plugin,
@NotNull final String name, @NotNull final String name,
final boolean removeUnused) { final boolean removeUnused) {
super(name, removeUnused, plugin); super(name, plugin, removeUnused, ConfigType.YAML);
} }
} }

View File

@@ -1,21 +1,22 @@
package com.willfp.eco.core.config.base; package com.willfp.eco.core.config.base;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.config.yaml.YamlBaseConfig; import com.willfp.eco.core.config.BaseConfig;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Default plugin lang.yml. * Default plugin lang.yml.
*/ */
public class LangYml extends YamlBaseConfig { public class LangYml extends BaseConfig {
/** /**
* Lang.yml. * Lang.yml.
* *
* @param plugin The plugin. * @param plugin The plugin.
*/ */
public LangYml(@NotNull final EcoPlugin plugin) { public LangYml(@NotNull final EcoPlugin plugin) {
super("lang", false, plugin); super("lang", plugin, false, ConfigType.YAML);
} }
/** /**

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.config.interfaces; package com.willfp.eco.core.config.interfaces;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -7,7 +8,7 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
/** /**
* All canfigs implement this interface. * All configs implement this interface.
* <p> * <p>
* Contains all methods that must exist in yaml and json configurations. * Contains all methods that must exist in yaml and json configurations.
*/ */
@@ -542,6 +543,13 @@ public interface Config extends Cloneable {
@Nullable @Nullable
List<? extends Config> getSubsectionsOrNull(@NotNull String path); List<? extends Config> getSubsectionsOrNull(@NotNull String path);
/**
* Get config type.
*
* @return The type.
*/
@NotNull
ConfigType getType();
/** /**
* Clone the config. * Clone the config.

View File

@@ -6,10 +6,14 @@ import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
/** /**
* JSON configs have extra methods compared to yaml configs. * JSON config.
* <p> *
* If you need to use them, then use JSONConfig instead. * @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
@SuppressWarnings("DeprecatedIsStillUsed")
public interface JSONConfig extends Config { public interface JSONConfig extends Config {
/** /**
* Get a list of subsections from config. * Get a list of subsections from config.

View File

@@ -1,12 +1,16 @@
package com.willfp.eco.core.config.interfaces; package com.willfp.eco.core.config.interfaces;
import org.bukkit.configuration.file.YamlConfiguration;
import org.bukkit.plugin.java.JavaPlugin;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
* Interface for configs that physically exist as files in plugins. * Interface for configs that physically exist as files in plugins.
*/ */
public interface LoadableConfig { public interface LoadableConfig extends Config {
/** /**
* Create the file. * Create the file.
*/ */
@@ -39,4 +43,18 @@ public interface LoadableConfig {
* @return The name. * @return The name.
*/ */
String getName(); String getName();
/**
* Get bukkit {@link YamlConfiguration}.
* <p>
* This method is not recommended unless absolutely required as it
* only returns true if the type of config is {@link com.willfp.eco.core.config.ConfigType#YAML},
* and if the handle is an {@link YamlConfiguration} specifically. This depends on the internals
* and the implementation, and so may cause problems - it exists mostly for parity with
* {@link JavaPlugin#getConfig()}.
*
* @return The config, or null if config is not yaml-based.
*/
@Nullable
YamlConfiguration getBukkitHandle();
} }

View File

@@ -5,8 +5,12 @@ import org.bukkit.configuration.file.YamlConfiguration;
/** /**
* Interface for configs that wrap an {@link YamlConfiguration}. * Interface for configs that wrap an {@link YamlConfiguration}.
* *
* @see com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper * @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
@SuppressWarnings("DeprecatedIsStillUsed")
public interface WrappedYamlConfiguration { public interface WrappedYamlConfiguration {
/** /**
* Get the ConfigurationSection handle. * Get the ConfigurationSection handle.

View File

@@ -3,6 +3,8 @@ package com.willfp.eco.core.config.json;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper; import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,7 +12,12 @@ import org.jetbrains.annotations.NotNull;
* Config implementation for configs present in the plugin's base directory (eg config.json). * Config implementation for configs present in the plugin's base directory (eg config.json).
* <p> * <p>
* Automatically updates. * Automatically updates.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper { public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
/** /**
* @param configName The name of the config * @param configName The name of the config
@@ -23,13 +30,16 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
@NotNull final PluginLike plugin, @NotNull final PluginLike plugin,
@NotNull final String... updateBlacklist) { @NotNull final String... updateBlacklist) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig( (JSONConfig)
configName, Eco.getHandler().getConfigFactory().createUpdatableConfig(
plugin, configName,
"", plugin,
plugin.getClass(), "",
removeUnused, updateBlacklist plugin.getClass(),
) removeUnused,
ConfigType.JSON,
updateBlacklist
)
); );
} }
@@ -42,13 +52,15 @@ public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
final boolean removeUnused, final boolean removeUnused,
@NotNull final PluginLike plugin) { @NotNull final PluginLike plugin) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig( (JSONConfig)
configName, Eco.getHandler().getConfigFactory().createUpdatableConfig(
plugin, configName,
"", plugin,
plugin.getClass(), "",
removeUnused plugin.getClass(),
) removeUnused,
ConfigType.JSON
)
); );
} }

View File

@@ -3,6 +3,8 @@ package com.willfp.eco.core.config.json;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper; import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,7 +16,12 @@ import org.jetbrains.annotations.NotNull;
* </ul> * </ul>
* <p> * <p>
* Automatically updates. * Automatically updates.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper { public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
/** /**
* @param configName The name of the config * @param configName The name of the config
@@ -31,16 +38,19 @@ public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
@NotNull final String subDirectoryPath, @NotNull final String subDirectoryPath,
@NotNull final String... updateBlacklist) { @NotNull final String... updateBlacklist) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig( (JSONConfig)
configName, Eco.getHandler().getConfigFactory().createUpdatableConfig(
plugin, configName,
subDirectoryPath, plugin,
source, subDirectoryPath,
removeUnused, source,
updateBlacklist removeUnused,
) ConfigType.JSON,
updateBlacklist
)
); );
} }
/** /**
* @param configName The name of the config * @param configName The name of the config
* @param removeUnused Whether keys not present in the default config should be removed on update. * @param removeUnused Whether keys not present in the default config should be removed on update.

View File

@@ -3,12 +3,19 @@ package com.willfp.eco.core.config.json;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper; import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Non-updatable JSON config that exists within a plugin jar. * Non-updatable JSON config that exists within a plugin jar.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper { public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
/** /**
* Config implementation for configs present in the plugin's base directory (eg config.json, lang.json). * Config implementation for configs present in the plugin's base directory (eg config.json, lang.json).
@@ -20,7 +27,7 @@ public abstract class JSONStaticBaseConfig extends LoadableJSONConfigWrapper {
*/ */
protected JSONStaticBaseConfig(@NotNull final String configName, protected JSONStaticBaseConfig(@NotNull final String configName,
@NotNull final PluginLike plugin) { @NotNull final PluginLike plugin) {
super(Eco.getHandler().getConfigFactory().createLoadableJSONConfig(configName, plugin, "", plugin.getClass())); super((JSONConfig) Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.JSON));
} }
/** /**

View File

@@ -1,14 +1,21 @@
package com.willfp.eco.core.config.json; package com.willfp.eco.core.config.json;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper; import com.willfp.eco.core.config.json.wrapper.JSONConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
/** /**
* Raw JSON config with a map of values at its core. * Raw JSON config with a map of values at its core.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public class JSONTransientConfig extends JSONConfigWrapper { public class JSONTransientConfig extends JSONConfigWrapper {
/** /**
* Config implementation for passing maps. * Config implementation for passing maps.
@@ -18,6 +25,13 @@ public class JSONTransientConfig extends JSONConfigWrapper {
* @param values The map of values. * @param values The map of values.
*/ */
public JSONTransientConfig(@NotNull final Map<String, Object> values) { public JSONTransientConfig(@NotNull final Map<String, Object> values) {
super(Eco.getHandler().getConfigFactory().createJSONConfig(values)); super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(values));
}
/**
* Empty JSON config.
*/
public JSONTransientConfig() {
super((JSONConfig) Eco.getHandler().getConfigFactory().createConfig(new HashMap<>()));
} }
} }

View File

@@ -9,7 +9,12 @@ import java.util.List;
/** /**
* Wrapper to handle the backend JSON config implementations. * Wrapper to handle the backend JSON config implementations.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig { public abstract class JSONConfigWrapper extends ConfigWrapper<JSONConfig> implements JSONConfig {
/** /**
* Create a config wrapper. * Create a config wrapper.

View File

@@ -3,14 +3,21 @@ package com.willfp.eco.core.config.json.wrapper;
import com.willfp.eco.core.config.interfaces.JSONConfig; import com.willfp.eco.core.config.interfaces.JSONConfig;
import com.willfp.eco.core.config.interfaces.LoadableConfig; import com.willfp.eco.core.config.interfaces.LoadableConfig;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
* Wrapper to handle the backend loadable JSON config implementations. * Wrapper to handle the backend loadable JSON config implementations.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig { public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implements LoadableConfig {
/** /**
* Create a config wrapper. * Create a config wrapper.
@@ -48,4 +55,9 @@ public abstract class LoadableJSONConfigWrapper extends JSONConfigWrapper implem
public String getName() { public String getName() {
return ((LoadableConfig) this.getHandle()).getName(); return ((LoadableConfig) this.getHandle()).getName();
} }
@Override
public @Nullable YamlConfiguration getBukkitHandle() {
return null;
}
} }

View File

@@ -23,8 +23,9 @@ import java.lang.annotation.Target;
* <p> * <p>
* The second: * The second:
* <pre>{@code * <pre>{@code
* public static void update(EcoPlugin plugin) {} * public static void update(EcoPlugin plugin) {
* // Update code * // Update code
* }
* }</pre> * }</pre>
* <p> * <p>
* Config update methods in all classes in a plugin jar will be called * Config update methods in all classes in a plugin jar will be called

View File

@@ -1,9 +1,11 @@
package com.willfp.eco.core.config.wrapper; package com.willfp.eco.core.config.wrapper;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.core.config.interfaces.JSONConfig; import com.willfp.eco.core.config.interfaces.LoadableConfig;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Map; import java.util.Map;
@@ -11,6 +13,7 @@ import java.util.Map;
/** /**
* Internal component to create backend config implementations. * Internal component to create backend config implementations.
*/ */
@ApiStatus.Internal
public interface ConfigFactory { public interface ConfigFactory {
/** /**
* Updatable config. * Updatable config.
@@ -20,75 +23,57 @@ public interface ConfigFactory {
* @param subDirectoryPath The subdirectory path. * @param subDirectoryPath The subdirectory path.
* @param source The class that owns the resource. * @param source The class that owns the resource.
* @param removeUnused Whether keys not present in the default config should be removed on update. * @param removeUnused Whether keys not present in the default config should be removed on update.
* @param type The config type.
* @param updateBlacklist Substring of keys to not add/remove keys for. * @param updateBlacklist Substring of keys to not add/remove keys for.
* @return The config implementation. * @return The config implementation.
*/ */
Config createUpdatableYamlConfig(@NotNull String configName, LoadableConfig createUpdatableConfig(@NotNull String configName,
@NotNull PluginLike plugin,
@NotNull String subDirectoryPath,
@NotNull Class<?> source,
boolean removeUnused,
@NotNull String... updateBlacklist);
/**
* Updatable config.
*
* @param configName The name of the config
* @param plugin The plugin.
* @param subDirectoryPath The subdirectory path.
* @param source The class that owns the resource.
* @param removeUnused Whether keys not present in the default config should be removed on update.
* @param updateBlacklist Substring of keys to not add/remove keys for.
* @return The config implementation.
*/
JSONConfig createUpdatableJSONConfig(@NotNull String configName,
@NotNull PluginLike plugin, @NotNull PluginLike plugin,
@NotNull String subDirectoryPath, @NotNull String subDirectoryPath,
@NotNull Class<?> source, @NotNull Class<?> source,
boolean removeUnused, boolean removeUnused,
@NotNull ConfigType type,
@NotNull String... updateBlacklist); @NotNull String... updateBlacklist);
/** /**
* JSON loadable config. * Loadable config.
* *
* @param configName The name of the config * @param configName The name of the config
* @param plugin The plugin. * @param plugin The plugin.
* @param subDirectoryPath The subdirectory path. * @param subDirectoryPath The subdirectory path.
* @param source The class that owns the resource. * @param source The class that owns the resource.
* @param type The config type.
* @return The config implementation. * @return The config implementation.
*/ */
JSONConfig createLoadableJSONConfig(@NotNull String configName, LoadableConfig createLoadableConfig(@NotNull String configName,
@NotNull PluginLike plugin, @NotNull PluginLike plugin,
@NotNull String subDirectoryPath, @NotNull String subDirectoryPath,
@NotNull Class<?> source); @NotNull Class<?> source,
@NotNull ConfigType type);
/** /**
* Yaml loadable config. * Create config.
*
* @param configName The name of the config
* @param plugin The plugin.
* @param subDirectoryPath The subdirectory path.
* @param source The class that owns the resource.
* @return The config implementation.
*/
Config createLoadableYamlConfig(@NotNull String configName,
@NotNull PluginLike plugin,
@NotNull String subDirectoryPath,
@NotNull Class<?> source);
/**
* Yaml config.
* *
* @param config The handle. * @param config The handle.
* @return The config implementation. * @return The config implementation.
*/ */
Config createYamlConfig(@NotNull YamlConfiguration config); Config createConfig(@NotNull YamlConfiguration config);
/** /**
* JSON config. * Create config.
* *
* @param values The values. * @param values The values.
* @return The config implementation. * @return The config implementation.
*/ */
JSONConfig createJSONConfig(@NotNull Map<String, Object> values); Config createConfig(@NotNull Map<String, Object> values);
/**
* Create config.
*
* @param contents The file contents.
* @param type The type.
* @return The config implementation.
*/
Config createConfig(@NotNull String contents,
@NotNull ConfigType type);
} }

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.config.wrapper; package com.willfp.eco.core.config.wrapper;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -15,6 +16,7 @@ import java.util.List;
* *
* @param <T> The type of the handle. * @param <T> The type of the handle.
*/ */
@SuppressWarnings("MethodDoesntCallSuperMethod")
public abstract class ConfigWrapper<T extends Config> implements Config { public abstract class ConfigWrapper<T extends Config> implements Config {
/** /**
* Configs from eco have an internal implementation, * Configs from eco have an internal implementation,
@@ -188,6 +190,11 @@ public abstract class ConfigWrapper<T extends Config> implements Config {
return handle.clone(); return handle.clone();
} }
@Override
public @NotNull ConfigType getType() {
return handle.getType();
}
/** /**
* Get the handle. * Get the handle.
* *

View File

@@ -0,0 +1,53 @@
package com.willfp.eco.core.config.wrapper;
import com.willfp.eco.core.config.interfaces.LoadableConfig;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File;
import java.io.IOException;
/**
* Wrapper to handle the backend loadable yaml config implementations.
*/
public abstract class LoadableConfigWrapper extends ConfigWrapper<LoadableConfig> implements LoadableConfig {
/**
* Create a config wrapper.
*
* @param handle The handle.
*/
protected LoadableConfigWrapper(@NotNull final LoadableConfig handle) {
super(handle);
}
@Override
public void createFile() {
this.getHandle().createFile();
}
@Override
public String getResourcePath() {
return this.getHandle().getResourcePath();
}
@Override
public void save() throws IOException {
this.getHandle().save();
}
@Override
public File getConfigFile() {
return this.getHandle().getConfigFile();
}
@Override
public String getName() {
return this.getHandle().getName();
}
@Override
public @Nullable YamlConfiguration getBukkitHandle() {
return this.getHandle().getBukkitHandle();
}
}

View File

@@ -3,6 +3,7 @@ package com.willfp.eco.core.config.yaml;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper; import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -10,7 +11,12 @@ import org.jetbrains.annotations.NotNull;
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml). * Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
* <p> * <p>
* Automatically updates. * Automatically updates.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper { public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
/** /**
* @param configName The name of the config * @param configName The name of the config
@@ -23,12 +29,14 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
@NotNull final PluginLike plugin, @NotNull final PluginLike plugin,
@NotNull final String... updateBlacklist) { @NotNull final String... updateBlacklist) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig( Eco.getHandler().getConfigFactory().createUpdatableConfig(
configName, configName,
plugin, plugin,
"", "",
plugin.getClass(), plugin.getClass(),
removeUnused, updateBlacklist removeUnused,
ConfigType.YAML,
updateBlacklist
) )
); );
} }
@@ -42,12 +50,13 @@ public abstract class YamlBaseConfig extends LoadableYamlConfigWrapper {
final boolean removeUnused, final boolean removeUnused,
@NotNull final PluginLike plugin) { @NotNull final PluginLike plugin) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig( Eco.getHandler().getConfigFactory().createUpdatableConfig(
configName, configName,
plugin, plugin,
"", "",
plugin.getClass(), plugin.getClass(),
removeUnused removeUnused,
ConfigType.YAML
) )
); );
} }

View File

@@ -3,6 +3,7 @@ package com.willfp.eco.core.config.yaml;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper; import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -14,7 +15,12 @@ import org.jetbrains.annotations.NotNull;
* </ul> * </ul>
* <p> * <p>
* Automatically updates. * Automatically updates.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper { public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
/** /**
* @param configName The name of the config * @param configName The name of the config
@@ -31,16 +37,18 @@ public abstract class YamlExtendableConfig extends LoadableYamlConfigWrapper {
@NotNull final String subDirectoryPath, @NotNull final String subDirectoryPath,
@NotNull final String... updateBlacklist) { @NotNull final String... updateBlacklist) {
super( super(
Eco.getHandler().getConfigFactory().createUpdatableYamlConfig( Eco.getHandler().getConfigFactory().createUpdatableConfig(
configName, configName,
plugin, plugin,
subDirectoryPath, subDirectoryPath,
source, source,
removeUnused, removeUnused,
ConfigType.YAML,
updateBlacklist updateBlacklist
) )
); );
} }
/** /**
* @param configName The name of the config * @param configName The name of the config
* @param removeUnused Whether keys not present in the default config should be removed on update. * @param removeUnused Whether keys not present in the default config should be removed on update.

View File

@@ -3,12 +3,18 @@ package com.willfp.eco.core.config.yaml;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.EcoPlugin; import com.willfp.eco.core.EcoPlugin;
import com.willfp.eco.core.PluginLike; import com.willfp.eco.core.PluginLike;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper; import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
/** /**
* Non-updatable yaml config that exists within a plugin jar. * Non-updatable yaml config that exists within a plugin jar.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper { public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
/** /**
* Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml). * Config implementation for configs present in the plugin's base directory (eg config.yml, lang.yml).
@@ -20,7 +26,7 @@ public abstract class YamlStaticBaseConfig extends LoadableYamlConfigWrapper {
*/ */
protected YamlStaticBaseConfig(@NotNull final String configName, protected YamlStaticBaseConfig(@NotNull final String configName,
@NotNull final PluginLike plugin) { @NotNull final PluginLike plugin) {
super(Eco.getHandler().getConfigFactory().createLoadableYamlConfig(configName, plugin, "", plugin.getClass())); super(Eco.getHandler().getConfigFactory().createLoadableConfig(configName, plugin, "", plugin.getClass(), ConfigType.YAML));
} }
/** /**

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.core.config.yaml; package com.willfp.eco.core.config.yaml;
import com.willfp.eco.core.Eco; import com.willfp.eco.core.Eco;
import com.willfp.eco.core.config.ConfigType;
import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper; import com.willfp.eco.core.config.yaml.wrapper.YamlConfigWrapper;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -11,26 +12,31 @@ import java.io.StringReader;
* Config implementation for passing YamlConfigurations. * Config implementation for passing YamlConfigurations.
* <p> * <p>
* Does not automatically update. * Does not automatically update.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public class YamlTransientConfig extends YamlConfigWrapper { public class YamlTransientConfig extends YamlConfigWrapper {
/** /**
* @param config The YamlConfiguration handle. * @param config The YamlConfiguration handle.
*/ */
public YamlTransientConfig(@NotNull final YamlConfiguration config) { public YamlTransientConfig(@NotNull final YamlConfiguration config) {
super(Eco.getHandler().getConfigFactory().createYamlConfig(config)); super(Eco.getHandler().getConfigFactory().createConfig(config));
} }
/** /**
* @param contents The contents of the config. * @param contents The contents of the config.
*/ */
public YamlTransientConfig(@NotNull final String contents) { public YamlTransientConfig(@NotNull final String contents) {
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader(contents)))); super(Eco.getHandler().getConfigFactory().createConfig(contents, ConfigType.YAML));
} }
/** /**
* Create a new empty transient config. * Create a new empty transient config.
*/ */
public YamlTransientConfig() { public YamlTransientConfig() {
super(Eco.getHandler().getConfigFactory().createYamlConfig(YamlConfiguration.loadConfiguration(new StringReader("")))); super(Eco.getHandler().getConfigFactory().createConfig(YamlConfiguration.loadConfiguration(new StringReader(""))));
} }
} }

View File

@@ -3,14 +3,21 @@ package com.willfp.eco.core.config.yaml.wrapper;
import com.willfp.eco.core.config.interfaces.Config; import com.willfp.eco.core.config.interfaces.Config;
import com.willfp.eco.core.config.interfaces.LoadableConfig; import com.willfp.eco.core.config.interfaces.LoadableConfig;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.configuration.file.YamlConfiguration;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.io.File; import java.io.File;
import java.io.IOException; import java.io.IOException;
/** /**
* Wrapper to handle the backend loadable yaml config implementations. * Wrapper to handle the backend loadable yaml config implementations.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig { public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implements LoadableConfig {
/** /**
* Create a config wrapper. * Create a config wrapper.
@@ -48,4 +55,9 @@ public abstract class LoadableYamlConfigWrapper extends YamlConfigWrapper implem
public String getName() { public String getName() {
return ((LoadableConfig) this.getHandle()).getName(); return ((LoadableConfig) this.getHandle()).getName();
} }
@Override
public @Nullable YamlConfiguration getBukkitHandle() {
return ((LoadableConfig) this.getHandle()).getBukkitHandle();
}
} }

View File

@@ -8,7 +8,12 @@ import org.jetbrains.annotations.NotNull;
/** /**
* Wrapper to handle the backend yaml config implementations. * Wrapper to handle the backend yaml config implementations.
*
* @deprecated JSON and yml have full parity, use configs without a prefix instead,
* eg {@link com.willfp.eco.core.config.TransientConfig}, {@link com.willfp.eco.core.config.BaseConfig}.
* These configs will be removed eventually.
*/ */
@Deprecated(since = "6.17.0")
public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration { public abstract class YamlConfigWrapper extends ConfigWrapper<Config> implements WrappedYamlConfiguration {
/** /**
* Create a config wrapper. * Create a config wrapper.

View File

@@ -60,7 +60,7 @@ public final class Display {
* @return The ItemStack. * @return The ItemStack.
*/ */
public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack, public static ItemStack displayAndFinalize(@NotNull final ItemStack itemStack,
@Nullable final Player player) { @Nullable final Player player) {
return finalize(display(itemStack, player)); return finalize(display(itemStack, player));
} }

View File

@@ -0,0 +1,143 @@
package com.willfp.eco.core.events;
import org.bukkit.Location;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.HandlerList;
import org.bukkit.event.player.PlayerEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
import java.util.Collection;
/**
* Called on DropQueue push.
*/
public class DropQueuePushEvent extends PlayerEvent implements Cancellable {
/**
* Cancel state.
*/
private boolean cancelled;
/**
* If telekinetic.
*/
private final boolean isTelekinetic;
/**
* The items.
*/
private final Collection<? extends ItemStack> items;
/**
* The xp.
*/
private final int xp;
/**
* The location.
*/
private final Location location;
/**
* Bukkit parity.
*/
private static final HandlerList HANDLERS = new HandlerList();
/**
* Create a new DropQueuePushEvent.
*
* @param player The player.
* @param items The items.
* @param location The location.
* @param xp The xp.
* @param isTelekinetic If the event is telekinetic.
*/
public DropQueuePushEvent(@NotNull final Player player,
@NotNull final Collection<? extends ItemStack> items,
@NotNull final Location location,
final int xp,
final boolean isTelekinetic) {
super(player);
this.items = items;
this.location = location;
this.xp = xp;
this.isTelekinetic = isTelekinetic;
}
/**
* Gets a list of handlers handling this event.
*
* @return A list of handlers handling this event.
*/
@Override
@NotNull
public HandlerList getHandlers() {
return HANDLERS;
}
/**
* Bukkit parity.
*
* @return The handler list.
*/
public static HandlerList getHandlerList() {
return HANDLERS;
}
/**
* Get cancel state.
*
* @return The cancel state.
*/
@Override
public boolean isCancelled() {
return this.cancelled;
}
/**
* Set cancel state.
*
* @param cancelled If cancelled.
*/
@Override
public void setCancelled(final boolean cancelled) {
this.cancelled = cancelled;
}
/**
* Get the items to be dropped.
*
* @return The items.
*/
public Collection<? extends ItemStack> getItems() {
return items;
}
/**
* Get the xp to be dropped.
*
* @return The xp.
*/
public int getXp() {
return xp;
}
/**
* Get the location.
*
* @return The location.
*/
public Location getLocation() {
return location;
}
/**
* Get force telekinesis state.
*
* @return The force telekinesis state.
*/
public boolean isTelekinetic() {
return this.isTelekinetic;
}
}

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.core.events; package com.willfp.eco.core.events;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.jetbrains.annotations.NotNull;
/** /**
* Manages listeners for a plugin. * Manages listeners for a plugin.
@@ -11,14 +12,14 @@ public interface EventManager {
* *
* @param listener The listener to register. * @param listener The listener to register.
*/ */
void registerListener(Listener listener); void registerListener(@NotNull Listener listener);
/** /**
* Unregister a listener with bukkit. * Unregister a listener with bukkit.
* *
* @param listener The listener to unregister. * @param listener The listener to unregister.
*/ */
void unregisterListener(Listener listener); void unregisterListener(@NotNull Listener listener);
/** /**
* Unregister all listeners associated with the plugin. * Unregister all listeners associated with the plugin.

View File

@@ -7,6 +7,7 @@ import org.apache.commons.lang.Validate;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.io.File; import java.io.File;
import java.util.logging.Logger;
/** /**
* An extension is a separate jar file that hooks into the base plugin jar. * An extension is a separate jar file that hooks into the base plugin jar.
@@ -143,6 +144,11 @@ public abstract class Extension implements PluginLike {
return this.plugin.getConfigHandler(); return this.plugin.getConfigHandler();
} }
@Override
public Logger getLogger() {
return this.plugin.getLogger();
}
/** /**
* Get the plugin for the extension. * Get the plugin for the extension.
* *

View File

@@ -1,7 +1,13 @@
package com.willfp.eco.core.integrations; package com.willfp.eco.core.integrations;
import org.bukkit.Bukkit;
import org.bukkit.plugin.Plugin;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
/** /**
* An integration loader runs a runnable only if a specific plugin is present on the server. * An integration loader runs a runnable only if a specific plugin is present on the server.
* <p> * <p>
@@ -9,7 +15,15 @@ import org.jetbrains.annotations.NotNull;
*/ */
public class IntegrationLoader { public class IntegrationLoader {
/** /**
* The lambda to be ran if the plugin is present. * All loaded plugins on the server.
*/
private static final Set<String> LOADED_PLUGINS = Arrays.stream(Bukkit.getPluginManager().getPlugins())
.map(Plugin::getName)
.map(String::toLowerCase)
.collect(Collectors.toSet());
/**
* The lambda to be run if the plugin is present.
*/ */
private final Runnable runnable; private final Runnable runnable;
@@ -22,7 +36,7 @@ public class IntegrationLoader {
* Create a new Integration Loader. * Create a new Integration Loader.
* *
* @param pluginName The plugin to require. * @param pluginName The plugin to require.
* @param onLoad The lambda to be ran if the plugin is present. * @param onLoad The lambda to be run if the plugin is present.
*/ */
public IntegrationLoader(@NotNull final String pluginName, public IntegrationLoader(@NotNull final String pluginName,
@NotNull final Runnable onLoad) { @NotNull final Runnable onLoad) {
@@ -30,6 +44,15 @@ public class IntegrationLoader {
this.pluginName = pluginName; this.pluginName = pluginName;
} }
/**
* Load the integration if the specified plugin is present on the server.
*/
public void loadIfPresent() {
if (LOADED_PLUGINS.contains(this.pluginName.toLowerCase())) {
this.load();
}
}
/** /**
* Load the integration. * Load the integration.
*/ */

View File

@@ -24,7 +24,7 @@ public final class AnticheatManager {
* @param anticheat The anticheat to register. * @param anticheat The anticheat to register.
*/ */
public static void register(@NotNull final EcoPlugin plugin, public static void register(@NotNull final EcoPlugin plugin,
@NotNull final AnticheatWrapper anticheat) { @NotNull final AnticheatWrapper anticheat) {
if (anticheat instanceof Listener) { if (anticheat instanceof Listener) {
plugin.getEventManager().registerListener((Listener) anticheat); plugin.getEventManager().registerListener((Listener) anticheat);
} }

View File

@@ -37,6 +37,17 @@ public final class AntigriefManager {
REGISTERED.remove(antigrief); REGISTERED.remove(antigrief);
} }
/**
* Can player pickup item.
*
* @param player The player.
* @param location The location.
* @return If player can pick up item.
*/
public static boolean canPickupItem(@NotNull final Player player, @NotNull final Location location) {
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPickupItem(player, location));
}
/** /**
* Can player break block. * Can player break block.
* *
@@ -45,7 +56,7 @@ public final class AntigriefManager {
* @return If player can break block. * @return If player can break block.
*/ */
public static boolean canBreakBlock(@NotNull final Player player, public static boolean canBreakBlock(@NotNull final Player player,
@NotNull final Block block) { @NotNull final Block block) {
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canBreakBlock(player, block)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canBreakBlock(player, block));
} }
@@ -57,7 +68,7 @@ public final class AntigriefManager {
* @return If player can create explosion. * @return If player can create explosion.
*/ */
public static boolean canCreateExplosion(@NotNull final Player player, public static boolean canCreateExplosion(@NotNull final Player player,
@NotNull final Location location) { @NotNull final Location location) {
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canCreateExplosion(player, location)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canCreateExplosion(player, location));
} }
@@ -69,7 +80,7 @@ public final class AntigriefManager {
* @return If player can place block. * @return If player can place block.
*/ */
public static boolean canPlaceBlock(@NotNull final Player player, public static boolean canPlaceBlock(@NotNull final Player player,
@NotNull final Block block) { @NotNull final Block block) {
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPlaceBlock(player, block)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canPlaceBlock(player, block));
} }
@@ -81,7 +92,7 @@ public final class AntigriefManager {
* @return If player can injure. * @return If player can injure.
*/ */
public static boolean canInjure(@NotNull final Player player, public static boolean canInjure(@NotNull final Player player,
@NotNull final LivingEntity victim) { @NotNull final LivingEntity victim) {
return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canInjure(player, victim)); return REGISTERED.stream().allMatch(antigriefWrapper -> antigriefWrapper.canInjure(player, victim));
} }

View File

@@ -5,6 +5,7 @@ import org.bukkit.Location;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
/** /**
* Wrapper class for antigrief integrations. * Wrapper class for antigrief integrations.
@@ -17,7 +18,7 @@ public interface AntigriefWrapper extends Integration {
* @param block The block. * @param block The block.
* @return If player can break block. * @return If player can break block.
*/ */
boolean canBreakBlock(Player player, Block block); boolean canBreakBlock(@NotNull Player player, @NotNull Block block);
/** /**
* Can player create explosion at location. * Can player create explosion at location.
@@ -26,7 +27,7 @@ public interface AntigriefWrapper extends Integration {
* @param location The location. * @param location The location.
* @return If player can create explosion. * @return If player can create explosion.
*/ */
boolean canCreateExplosion(Player player, Location location); boolean canCreateExplosion(@NotNull Player player, @NotNull Location location);
/** /**
* Can player place block. * Can player place block.
@@ -35,7 +36,7 @@ public interface AntigriefWrapper extends Integration {
* @param block The block. * @param block The block.
* @return If player can place block. * @return If player can place block.
*/ */
boolean canPlaceBlock(Player player, Block block); boolean canPlaceBlock(@NotNull Player player, @NotNull Block block);
/** /**
* Can player injure living entity. * Can player injure living entity.
@@ -44,5 +45,16 @@ public interface AntigriefWrapper extends Integration {
* @param victim The victim. * @param victim The victim.
* @return If player can injure. * @return If player can injure.
*/ */
boolean canInjure(Player player, LivingEntity victim); boolean canInjure(@NotNull Player player, @NotNull LivingEntity victim);
/**
* Can player pick up item.
*
* @param player The player.
* @param location The location.
* @return If player can pick up item.
*/
default boolean canPickupItem(@NotNull Player player, @NotNull Location location) {
return true;
}
} }

View File

@@ -41,7 +41,7 @@ public final class EconomyManager {
* @return If the player has the amount. * @return If the player has the amount.
*/ */
public static boolean hasAmount(@NotNull final OfflinePlayer player, public static boolean hasAmount(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : REGISTERED) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.hasAmount(player, amount); return wrapper.hasAmount(player, amount);
} }
@@ -57,7 +57,7 @@ public final class EconomyManager {
* @return If the transaction was a success. * @return If the transaction was a success.
*/ */
public static boolean giveMoney(@NotNull final OfflinePlayer player, public static boolean giveMoney(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : REGISTERED) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.giveMoney(player, amount); return wrapper.giveMoney(player, amount);
} }
@@ -73,7 +73,7 @@ public final class EconomyManager {
* @return If the transaction was a success. * @return If the transaction was a success.
*/ */
public static boolean removeMoney(@NotNull final OfflinePlayer player, public static boolean removeMoney(@NotNull final OfflinePlayer player,
final double amount) { final double amount) {
for (EconomyWrapper wrapper : REGISTERED) { for (EconomyWrapper wrapper : REGISTERED) {
return wrapper.removeMoney(player, amount); return wrapper.removeMoney(player, amount);
} }

View File

@@ -33,7 +33,7 @@ public final class HologramManager {
* @return The hologram. * @return The hologram.
*/ */
public static Hologram createHologram(@NotNull final Location location, public static Hologram createHologram(@NotNull final Location location,
@NotNull final List<String> contents) { @NotNull final List<String> contents) {
for (HologramWrapper wrapper : REGISTERED) { for (HologramWrapper wrapper : REGISTERED) {
return wrapper.createHologram(location, contents); return wrapper.createHologram(location, contents);
} }

View File

@@ -50,7 +50,7 @@ public final class Items {
* @param item The item. * @param item The item.
*/ */
public static void registerCustomItem(@NotNull final NamespacedKey key, public static void registerCustomItem(@NotNull final NamespacedKey key,
@NotNull final TestableItem item) { @NotNull final TestableItem item) {
REGISTRY.put(key, item); REGISTRY.put(key, item);
} }
@@ -104,6 +104,7 @@ public final class Items {
* @param key The lookup string. * @param key The lookup string.
* @return The testable item, or an {@link EmptyTestableItem}. * @return The testable item, or an {@link EmptyTestableItem}.
*/ */
@NotNull
public static TestableItem lookup(@NotNull final String key) { public static TestableItem lookup(@NotNull final String key) {
if (key.contains("?")) { if (key.contains("?")) {
String[] options = key.split("\\?"); String[] options = key.split("\\?");
@@ -235,6 +236,37 @@ public final class Items {
} }
} }
/**
* Get a Testable Item from an ItemStack.
* <p>
* Will search for registered items first. If there are no matches in the registry,
* then it will return a {@link MaterialTestableItem} matching the item type.
* <p>
* Does not account for modifiers (arg parser data).
*
* @param item The ItemStack.
* @return The found Testable Item.
*/
@NotNull
public static TestableItem getItem(@Nullable final ItemStack item) {
if (item == null || item.getType().isAir()) {
return new EmptyTestableItem();
}
CustomItem customItem = getCustomItem(item);
if (customItem != null) {
return customItem;
}
for (TestableItem known : REGISTRY.values()) {
if (known.matches(item)) {
return known;
}
}
return new MaterialTestableItem(item.getType());
}
/** /**
* Get if itemStack is a custom item. * Get if itemStack is a custom item.
* *
@@ -284,6 +316,7 @@ public final class Items {
* @param item The item. * @param item The item.
* @return The CustomItem. * @return The CustomItem.
*/ */
@NotNull
public static CustomItem getOrWrap(@NotNull final TestableItem item) { public static CustomItem getOrWrap(@NotNull final TestableItem item) {
if (item instanceof CustomItem) { if (item instanceof CustomItem) {
return (CustomItem) item; return (CustomItem) item;

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.args; package com.willfp.eco.core.items.args;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
* *
* @deprecated Moved to internals. * @deprecated Moved to internals.
*/ */
@Deprecated(forRemoval = true) @Deprecated(since = "6.16.0", forRemoval = true)
public class ColorArgParser implements LookupArgParser { public class ColorArgParser implements LookupArgParser {
/**
* Instantiate arg parser.
*/
public ColorArgParser() {
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
}
@Override @Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args, public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) { @NotNull final ItemMeta meta) {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.args; package com.willfp.eco.core.items.args;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
* *
* @deprecated Moved to internals. * @deprecated Moved to internals.
*/ */
@Deprecated(forRemoval = true) @Deprecated(since = "6.16.0", forRemoval = true)
public class CustomModelDataArgParser implements LookupArgParser { public class CustomModelDataArgParser implements LookupArgParser {
/**
* Instantiate arg parser.
*/
public CustomModelDataArgParser() {
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
}
@Override @Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args, public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) { @NotNull final ItemMeta meta) {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.args; package com.willfp.eco.core.items.args;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
* *
* @deprecated Moved to internals. * @deprecated Moved to internals.
*/ */
@Deprecated(forRemoval = true) @Deprecated(since = "6.16.0", forRemoval = true)
public class EnchantmentArgParser implements LookupArgParser { public class EnchantmentArgParser implements LookupArgParser {
/**
* Instantiate arg parser.
*/
public EnchantmentArgParser() {
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
}
@Override @Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args, public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) { @NotNull final ItemMeta meta) {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.args; package com.willfp.eco.core.items.args;
import org.bukkit.Bukkit;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
@@ -12,8 +13,15 @@ import java.util.function.Predicate;
* *
* @deprecated Moved to internals. * @deprecated Moved to internals.
*/ */
@Deprecated(forRemoval = true) @Deprecated(since = "6.16.0", forRemoval = true)
public class TextureArgParser implements LookupArgParser { public class TextureArgParser implements LookupArgParser {
/**
* Instantiate arg parser.
*/
public TextureArgParser() {
Bukkit.getLogger().severe("Instantiation of class marked for removal! (" + this.getClass().getName() + "), this will throw an error in a future release!");
}
@Override @Override
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args, public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
@NotNull final ItemMeta meta) { @NotNull final ItemMeta meta) {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.builder; package com.willfp.eco.core.items.builder;
import com.willfp.eco.core.items.TestableItem;
import com.willfp.eco.util.StringUtils; import com.willfp.eco.util.StringUtils;
import org.apache.commons.lang.Validate; import org.apache.commons.lang.Validate;
import org.bukkit.Material; import org.bukkit.Material;
@@ -43,6 +44,15 @@ public abstract class AbstractItemStackBuilder<T extends ItemMeta, U extends Abs
this(new ItemStack(material)); this(new ItemStack(material));
} }
/**
* Create a new ItemStackBuilder to modify an existing item.
*
* @param item The item to start with.
*/
protected AbstractItemStackBuilder(@NotNull final TestableItem item) {
this(item.getItem());
}
/** /**
* Create a new ItemStackBuilder to modify an existing item. * Create a new ItemStackBuilder to modify an existing item.
* *

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.builder; package com.willfp.eco.core.items.builder;
import com.willfp.eco.core.items.TestableItem;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
@@ -26,4 +27,13 @@ public class ItemStackBuilder extends AbstractItemStackBuilder<ItemMeta, ItemSta
public ItemStackBuilder(@NotNull final ItemStack base) { public ItemStackBuilder(@NotNull final ItemStack base) {
super(base); super(base);
} }
/**
* Create a new ItemStackBuilder to modify an existing item.
*
* @param item The item to start with.
*/
public ItemStackBuilder(@NotNull final TestableItem item) {
super(item);
}
} }

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.core.items.builder; package com.willfp.eco.core.items.builder;
import com.willfp.eco.core.items.TestableItem;
import org.bukkit.Color; import org.bukkit.Color;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
@@ -30,6 +31,15 @@ public class LeatherArmorBuilder extends AbstractItemStackBuilder<LeatherArmorMe
super(base); super(base);
} }
/**
* Create a new ItemStackBuilder to modify an existing item.
*
* @param item The item to start with.
*/
public LeatherArmorBuilder(@NotNull final TestableItem item) {
super(item);
}
/** /**
* Set leather color. * Set leather color.
* *

View File

@@ -1,14 +1,12 @@
package com.willfp.eco.core.proxy; package com.willfp.eco.core.proxy;
/** /**
* All proxies must implement this interface. * Prior to 6.17.0, all proxies were required to implement this interface,
* <p> * however it produced no functionality and was not even used internally.
* A proxy is an NMS implementation of a proxy interface. *
* <p> * @deprecated Unused class, not required. Will be removed in a subsequent release.
* This allows for cross-version support.
* <p>
* See the core-spigot and core-nms modules of eco to see an example.
*/ */
@Deprecated(since = "6.17.0", forRemoval = true)
public interface AbstractProxy { public interface AbstractProxy {
} }

View File

@@ -13,5 +13,5 @@ public interface ProxyFactory {
* @param <T> The proxy class. * @param <T> The proxy class.
* @return The proxy implementation. * @return The proxy implementation.
*/ */
<T extends AbstractProxy> @NotNull T getProxy(@NotNull Class<T> proxyClass); <T> @NotNull T getProxy(@NotNull Class<T> proxyClass);
} }

View File

@@ -79,7 +79,27 @@ public final class Recipes {
@NotNull final String key, @NotNull final String key,
@NotNull final ItemStack output, @NotNull final ItemStack output,
@NotNull final List<String> recipeStrings) { @NotNull final List<String> recipeStrings) {
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key).setOutput(output); return createAndRegisterRecipe(plugin, key, output, recipeStrings, null);
}
/**
* Create and register recipe.
*
* @param plugin The plugin.
* @param key The key.
* @param output The output.
* @param recipeStrings The recipe.
* @param permission The permission.
* @return The recipe.
*/
public static CraftingRecipe createAndRegisterRecipe(@NotNull final EcoPlugin plugin,
@NotNull final String key,
@NotNull final ItemStack output,
@NotNull final List<String> recipeStrings,
@Nullable final String permission) {
ShapedCraftingRecipe.Builder builder = ShapedCraftingRecipe.builder(plugin, key)
.setOutput(output)
.setPermission(permission);
for (int i = 0; i < 9; i++) { for (int i = 0; i < 9; i++) {
builder.setRecipePart(i, Items.lookup(recipeStrings.get(i))); builder.setRecipePart(i, Items.lookup(recipeStrings.get(i)));

View File

@@ -4,6 +4,7 @@ import com.willfp.eco.core.items.TestableItem;
import org.bukkit.NamespacedKey; import org.bukkit.NamespacedKey;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.List; import java.util.List;
@@ -31,6 +32,7 @@ public interface CraftingRecipe {
* *
* @return The parts. * @return The parts.
*/ */
@NotNull
List<TestableItem> getParts(); List<TestableItem> getParts();
/** /**
@@ -38,6 +40,7 @@ public interface CraftingRecipe {
* *
* @return The key. * @return The key.
*/ */
@NotNull
NamespacedKey getKey(); NamespacedKey getKey();
/** /**
@@ -45,6 +48,7 @@ public interface CraftingRecipe {
* *
* @return The key. * @return The key.
*/ */
@NotNull
NamespacedKey getDisplayedKey(); NamespacedKey getDisplayedKey();
/** /**
@@ -52,5 +56,16 @@ public interface CraftingRecipe {
* *
* @return The output. * @return The output.
*/ */
@NotNull
ItemStack getOutput(); ItemStack getOutput();
/**
* Get the recipe permission.
*
* @return The permission.
*/
@Nullable
default String getPermission() {
return null;
}
} }

View File

@@ -15,6 +15,7 @@ import org.bukkit.inventory.RecipeChoice;
import org.bukkit.inventory.ShapedRecipe; import org.bukkit.inventory.ShapedRecipe;
import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.ItemMeta;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -44,16 +45,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
*/ */
private final ItemStack output; private final ItemStack output;
/**
* The permission.
*/
private final String permission;
private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin, private ShapedCraftingRecipe(@NotNull final EcoPlugin plugin,
@NotNull final String key, @NotNull final String key,
@NotNull final List<TestableItem> parts, @NotNull final List<TestableItem> parts,
@NotNull final ItemStack output) { @NotNull final ItemStack output,
@Nullable final String permission) {
super(plugin); super(plugin);
this.parts = parts; this.parts = parts;
this.key = plugin.getNamespacedKeyFactory().create(key); this.key = plugin.getNamespacedKeyFactory().create(key);
this.displayedKey = plugin.getNamespacedKeyFactory().create(key + "_displayed"); this.displayedKey = plugin.getNamespacedKeyFactory().create(key + "_displayed");
this.output = output; this.output = output;
this.permission = permission;
} }
@Override @Override
@@ -140,6 +148,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
* *
* @return The parts. * @return The parts.
*/ */
@NotNull
@Override
public List<TestableItem> getParts() { public List<TestableItem> getParts() {
return this.parts; return this.parts;
} }
@@ -149,6 +159,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
* *
* @return The key. * @return The key.
*/ */
@NotNull
@Override
public NamespacedKey getKey() { public NamespacedKey getKey() {
return this.key; return this.key;
} }
@@ -158,6 +170,8 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
* *
* @return The displayed key. * @return The displayed key.
*/ */
@NotNull
@Override
public NamespacedKey getDisplayedKey() { public NamespacedKey getDisplayedKey() {
return this.displayedKey; return this.displayedKey;
} }
@@ -167,10 +181,23 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
* *
* @return The output. * @return The output.
*/ */
@NotNull
@Override
public ItemStack getOutput() { public ItemStack getOutput() {
return this.output; return this.output;
} }
/**
* Get the permission.
*
* @return The permission.
*/
@Nullable
@Override
public String getPermission() {
return permission;
}
/** /**
* Builder for recipes. * Builder for recipes.
*/ */
@@ -185,6 +212,11 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
*/ */
private ItemStack output = null; private ItemStack output = null;
/**
* The permission for the recipe.
*/
private String permission = null;
/** /**
* The key of the recipe. * The key of the recipe.
*/ */
@@ -244,6 +276,17 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
return this; return this;
} }
/**
* Set the permission required to craft the recipe.
*
* @param permission The permission.
* @return The builder.
*/
public Builder setPermission(@Nullable final String permission) {
this.permission = permission;
return this;
}
/** /**
* Build the recipe. * Build the recipe.
* *
@@ -256,7 +299,7 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
} }
} }
return new ShapedCraftingRecipe(plugin, key.toLowerCase(), recipeParts, output); return new ShapedCraftingRecipe(plugin, key.toLowerCase(), recipeParts, output, permission);
} }
} }
} }

View File

@@ -18,6 +18,20 @@ public interface Scheduler {
BukkitTask runLater(@NotNull Runnable runnable, BukkitTask runLater(@NotNull Runnable runnable,
long ticksLater); long ticksLater);
/**
* Run the task after a specified tick delay.
* <p>
* Reordered for better kotlin interop.
*
* @param runnable The lambda to run.
* @param ticksLater The amount of ticks to wait before execution.
* @return The created {@link BukkitTask}.
*/
default BukkitTask runLater(long ticksLater,
@NotNull Runnable runnable) {
return runLater(runnable, ticksLater);
}
/** /**
* Run the task repeatedly on a timer. * Run the task repeatedly on a timer.
* *
@@ -30,6 +44,22 @@ public interface Scheduler {
long delay, long delay,
long repeat); long repeat);
/**
* Run the task repeatedly on a timer.
* <p>
* Reordered for better kotlin interop.
*
* @param runnable The lambda to run.
* @param delay The amount of ticks to wait before the first execution.
* @param repeat The amount of ticks to wait between executions.
* @return The created {@link BukkitTask}.
*/
default BukkitTask runTimer(long delay,
long repeat,
@NotNull Runnable runnable) {
return runTimer(runnable, delay, repeat);
}
/** /**
* Run the task repeatedly and asynchronously on a timer. * Run the task repeatedly and asynchronously on a timer.
* *
@@ -42,6 +72,22 @@ public interface Scheduler {
long delay, long delay,
long repeat); long repeat);
/**
* Run the task repeatedly and asynchronously on a timer.
* <p>
* Reordered for better kotlin interop.
*
* @param runnable The lambda to run.
* @param delay The amount of ticks to wait before the first execution.
* @param repeat The amount of ticks to wait between executions.
* @return The created {@link BukkitTask}.
*/
default BukkitTask runAsyncTimer(long delay,
long repeat,
@NotNull Runnable runnable) {
return runAsyncTimer(runnable, delay, repeat);
}
/** /**
* Run the task. * Run the task.
* *
@@ -70,6 +116,22 @@ public interface Scheduler {
long delay, long delay,
long repeat); long repeat);
/**
* Schedule the task to be ran repeatedly on a timer.
* <p>
* Reordered for better kotlin interop.
*
* @param runnable The lambda to run.
* @param delay The amount of ticks to wait before the first execution.
* @param repeat The amount of ticks to wait between executions.
* @return The id of the task.
*/
default int syncRepeating(long delay,
long repeat,
@NotNull Runnable runnable) {
return syncRepeating(runnable, delay, repeat);
}
/** /**
* Cancel all running tasks from the linked {@link EcoPlugin}. * Cancel all running tasks from the linked {@link EcoPlugin}.
*/ */

View File

@@ -92,7 +92,7 @@ public class Paste {
conn.setRequestMethod("GET"); conn.setRequestMethod("GET");
try (var reader = new BufferedReader( try (var reader = new BufferedReader(
new InputStreamReader(conn.getInputStream()))) { new InputStreamReader(conn.getInputStream()))) {
for (String line; (line = reader.readLine()) != null;) { for (String line; (line = reader.readLine()) != null; ) {
result.append(line); result.append(line);
} }
} }

View File

@@ -1,8 +1,10 @@
package com.willfp.eco.util; package com.willfp.eco.util;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -55,6 +57,40 @@ public final class ListUtils {
return frequencyMap; return frequencyMap;
} }
/**
* Convert nullable object to either singleton list or empty list.
*
* @param object The object.
* @param <T> The type of the object.
* @return The list.
*/
@NotNull
public static <T> List<T> toSingletonList(@Nullable final T object) {
if (object == null) {
return Collections.emptyList();
} else {
return Collections.singletonList(object);
}
}
/**
* Get element from list or return null if out of bounds.
*
* @param list The list.
* @param index The index.
* @param <T> The type of the list.
* @return The found element, or null if out of bounds.
*/
@Nullable
public static <T> T getOrNull(@Nullable final List<T> list,
final int index) {
if (list == null) {
return null;
}
return index >= 0 && index < list.size() ? list.get(index) : null;
}
private ListUtils() { private ListUtils() {
throw new UnsupportedOperationException("This is a utility class and cannot be instantiated"); throw new UnsupportedOperationException("This is a utility class and cannot be instantiated");
} }

View File

@@ -16,30 +16,45 @@ public final class PotionUtils {
public static int getDuration(@NotNull final PotionData data) { public static int getDuration(@NotNull final PotionData data) {
if (data.isExtended()) { if (data.isExtended()) {
return switch (data.getType()) { return switch (data.getType()) {
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0; case INSTANT_DAMAGE, INSTANT_HEAL:
case POISON, REGEN: yield 1800; yield 0;
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 4800; case POISON, REGEN:
case TURTLE_MASTER: yield 800; yield 1800;
default: yield 9600; case SLOW_FALLING, WEAKNESS, SLOWNESS:
yield 4800;
case TURTLE_MASTER:
yield 800;
default:
yield 9600;
}; };
} }
if (data.isUpgraded()) { if (data.isUpgraded()) {
return switch (data.getType()) { return switch (data.getType()) {
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0; case INSTANT_DAMAGE, INSTANT_HEAL:
case POISON, REGEN: yield 420; yield 0;
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 440; case POISON, REGEN:
case TURTLE_MASTER: yield 400; yield 420;
default: yield 1800; case SLOW_FALLING, WEAKNESS, SLOWNESS:
yield 440;
case TURTLE_MASTER:
yield 400;
default:
yield 1800;
}; };
} }
return switch (data.getType()) { return switch (data.getType()) {
case INSTANT_DAMAGE, INSTANT_HEAL: yield 0; case INSTANT_DAMAGE, INSTANT_HEAL:
case POISON, REGEN: yield 900; yield 0;
case SLOW_FALLING, WEAKNESS, SLOWNESS: yield 400; case POISON, REGEN:
case TURTLE_MASTER: yield 1800; yield 900;
default: yield 3600; case SLOW_FALLING, WEAKNESS, SLOWNESS:
yield 400;
case TURTLE_MASTER:
yield 1800;
default:
yield 3600;
}; };
} }

View File

@@ -35,7 +35,7 @@ public final class SkullUtils {
* @param base64 The base64 texture. * @param base64 The base64 texture.
*/ */
public static void setSkullTexture(@NotNull final SkullMeta meta, public static void setSkullTexture(@NotNull final SkullMeta meta,
@NotNull final String base64) { @NotNull final String base64) {
Validate.isTrue(initialized, "Must be initialized!"); Validate.isTrue(initialized, "Must be initialized!");
Validate.notNull(metaSetConsumer, "Must be initialized!"); Validate.notNull(metaSetConsumer, "Must be initialized!");
@@ -64,7 +64,7 @@ public final class SkullUtils {
*/ */
@ApiStatus.Internal @ApiStatus.Internal
public static void initialize(@NotNull final BiConsumer<SkullMeta, String> function, public static void initialize(@NotNull final BiConsumer<SkullMeta, String> function,
@NotNull final Function<SkullMeta, String> function2) { @NotNull final Function<SkullMeta, String> function2) {
Validate.isTrue(!initialized, "Already initialized!"); Validate.isTrue(!initialized, "Already initialized!");
metaSetConsumer = function; metaSetConsumer = function;

View File

@@ -14,7 +14,7 @@ import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import java.awt.*; import java.awt.Color;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;

View File

@@ -1,87 +1,93 @@
package com.willfp.eco.internal.config package com.willfp.eco.internal.config
import com.willfp.eco.core.PluginLike import com.willfp.eco.core.PluginLike
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.eco.core.config.interfaces.LoadableConfig
import com.willfp.eco.core.config.wrapper.ConfigFactory import com.willfp.eco.core.config.wrapper.ConfigFactory
import com.willfp.eco.internal.config.json.EcoJSONConfigSection import com.willfp.eco.internal.config.json.EcoJSONConfigSection
import com.willfp.eco.internal.config.json.EcoJSONConfigWrapper
import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig
import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
import org.bukkit.configuration.file.YamlConfiguration import org.bukkit.configuration.file.YamlConfiguration
import java.io.StringReader
class EcoConfigFactory : ConfigFactory { class EcoConfigFactory : ConfigFactory {
override fun createUpdatableYamlConfig( override fun createConfig(config: YamlConfiguration): Config {
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>,
removeUnused: Boolean,
vararg updateBlacklist: String
): Config {
return EcoUpdatableYamlConfig(
configName,
plugin,
subDirectoryPath,
source,
removeUnused,
*updateBlacklist
)
}
override fun createUpdatableJSONConfig(
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>,
removeUnused: Boolean,
vararg updateBlacklist: String
): JSONConfig {
return EcoUpdatableJSONConfig(
configName,
plugin,
subDirectoryPath,
source,
removeUnused,
*updateBlacklist
)
}
override fun createLoadableJSONConfig(
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>
): JSONConfig {
return EcoLoadableJSONConfig(
configName,
plugin,
subDirectoryPath,
source
)
}
override fun createLoadableYamlConfig(
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>
): Config {
return EcoLoadableYamlConfig(
configName,
plugin,
subDirectoryPath,
source
)
}
override fun createYamlConfig(config: YamlConfiguration): Config {
return EcoYamlConfigSection(config) return EcoYamlConfigSection(config)
} }
override fun createJSONConfig(values: Map<String, Any>): JSONConfig { override fun createConfig(values: MutableMap<String, Any>): Config {
return EcoJSONConfigSection(values) return EcoJSONConfigSection(values)
} }
override fun createConfig(contents: String, type: ConfigType): Config {
return if (type == ConfigType.JSON) {
@Suppress("UNCHECKED_CAST")
EcoJSONConfigSection(
EcoJSONConfigWrapper.gson.fromJson(
StringReader(contents), Map::class.java
) as MutableMap<String, Any>
)
} else {
EcoYamlConfigSection(YamlConfiguration.loadConfiguration(StringReader(contents)))
}
}
override fun createLoadableConfig(
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>,
type: ConfigType
): LoadableConfig {
return if (type == ConfigType.JSON) {
EcoLoadableJSONConfig(
configName,
plugin,
subDirectoryPath,
source
)
} else {
EcoLoadableYamlConfig(
configName,
plugin,
subDirectoryPath,
source
)
}
}
override fun createUpdatableConfig(
configName: String,
plugin: PluginLike,
subDirectoryPath: String,
source: Class<*>,
removeUnused: Boolean,
type: ConfigType,
vararg updateBlacklist: String
): LoadableConfig {
return if (type == ConfigType.JSON) {
EcoUpdatableJSONConfig(
configName,
plugin,
subDirectoryPath,
source,
removeUnused,
*updateBlacklist
)
} else {
EcoUpdatableYamlConfig(
configName,
plugin,
subDirectoryPath,
source,
removeUnused,
*updateBlacklist
)
}
}
} }

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.internal.config.json package com.willfp.eco.internal.config.json
@Suppress("UNCHECKED_CAST")
class EcoJSONConfigSection(values: Map<String, Any?>) : EcoJSONConfigWrapper() { class EcoJSONConfigSection(values: Map<String, Any?>) : EcoJSONConfigWrapper() {
init { init {
init(values) init(values)

View File

@@ -1,18 +1,24 @@
@file:Suppress("DEPRECATION")
package com.willfp.eco.internal.config.json package com.willfp.eco.internal.config.json
import com.google.gson.Gson import com.google.gson.Gson
import com.google.gson.GsonBuilder import com.google.gson.GsonBuilder
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.interfaces.JSONConfig import com.willfp.eco.core.config.interfaces.JSONConfig
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import org.bukkit.configuration.file.YamlConfiguration
import java.util.Objects import java.util.Objects
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
@Suppress("UNCHECKED_CAST") @Suppress("UNCHECKED_CAST")
open class EcoJSONConfigWrapper : JSONConfig { open class EcoJSONConfigWrapper : JSONConfig {
val handle: Gson = GsonBuilder() companion object {
.setPrettyPrinting() val gson: Gson = GsonBuilder()
.disableHtmlEscaping() .setPrettyPrinting()
.create() .disableHtmlEscaping()
.create()
}
val values = ConcurrentHashMap<String, Any?>() val values = ConcurrentHashMap<String, Any?>()
@@ -28,14 +34,14 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
override fun toPlaintext(): String { override fun toPlaintext(): String {
return this.handle.toJson(this.values) return gson.toJson(this.values)
} }
override fun has(path: String): Boolean { override fun has(path: String): Boolean {
return getOfKnownType(path, Any::class.java) != null return getOfKnownType(path, Any::class.java) != null
} }
private fun <T: Any?> getOfKnownType( private fun <T : Any?> getOfKnownType(
path: String, path: String,
clazz: Class<T> clazz: Class<T>
): T? { ): T? {
@@ -173,7 +179,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
override fun getInts(path: String): MutableList<Int> { override fun getInts(path: String): MutableList<Int> {
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Int>()) as List<Int>).toMutableList() return (Objects.requireNonNullElse(
getOfKnownType(path, Any::class.java),
emptyList<Int>()
) as List<Int>).toMutableList()
} }
override fun getIntsOrNull(path: String): MutableList<Int>? { override fun getIntsOrNull(path: String): MutableList<Int>? {
@@ -197,7 +206,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
override fun getBools(path: String): MutableList<Boolean> { override fun getBools(path: String): MutableList<Boolean> {
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Boolean>()) as List<Boolean>).toMutableList() return (Objects.requireNonNullElse(
getOfKnownType(path, Any::class.java),
emptyList<Boolean>()
) as List<Boolean>).toMutableList()
} }
override fun getBoolsOrNull(path: String): MutableList<Boolean>? { override fun getBoolsOrNull(path: String): MutableList<Boolean>? {
@@ -235,7 +247,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
option: StringUtils.FormatOption option: StringUtils.FormatOption
): MutableList<String> { ): MutableList<String> {
val strings = val strings =
(Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<String>()) as List<String>).toMutableList() (Objects.requireNonNullElse(
getOfKnownType(path, Any::class.java),
emptyList<String>()
) as List<String>).toMutableList()
return if (format) StringUtils.formatList(strings, option) else strings return if (format) StringUtils.formatList(strings, option) else strings
} }
@@ -264,7 +279,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
override fun getDoubles(path: String): MutableList<Double> { override fun getDoubles(path: String): MutableList<Double> {
return (Objects.requireNonNullElse(getOfKnownType(path, Any::class.java), emptyList<Double>()) as List<Double>).toMutableList() return (Objects.requireNonNullElse(
getOfKnownType(path, Any::class.java),
emptyList<Double>()
) as List<Double>).toMutableList()
} }
override fun getDoublesOrNull(path: String): MutableList<Double>? { override fun getDoublesOrNull(path: String): MutableList<Double>? {
@@ -275,6 +293,10 @@ open class EcoJSONConfigWrapper : JSONConfig {
} }
} }
override fun getType(): ConfigType {
return ConfigType.JSON
}
override fun clone(): JSONConfig { override fun clone(): JSONConfig {
return EcoJSONConfigSection(this.values.toMutableMap()) return EcoJSONConfigSection(this.values.toMutableMap())
} }

View File

@@ -2,6 +2,7 @@ package com.willfp.eco.internal.config.json
import com.willfp.eco.core.PluginLike import com.willfp.eco.core.PluginLike
import com.willfp.eco.core.config.interfaces.LoadableConfig import com.willfp.eco.core.config.interfaces.LoadableConfig
import org.bukkit.configuration.file.YamlConfiguration
import java.io.File import java.io.File
import java.io.FileNotFoundException import java.io.FileNotFoundException
import java.io.FileOutputStream import java.io.FileOutputStream
@@ -30,7 +31,7 @@ open class EcoLoadableJSONConfig(
} }
} }
override fun createFile() { final override fun createFile() {
val inputStream = source.getResourceAsStream(resourcePath)!! val inputStream = source.getResourceAsStream(resourcePath)!!
val outFile = File(this.plugin.dataFolder, resourcePath) val outFile = File(this.plugin.dataFolder, resourcePath)
val lastIndex = resourcePath.lastIndexOf('/') val lastIndex = resourcePath.lastIndexOf('/')
@@ -40,7 +41,7 @@ open class EcoLoadableJSONConfig(
} }
if (!outFile.exists()) { if (!outFile.exists()) {
val out: OutputStream = FileOutputStream(outFile) val out: OutputStream = FileOutputStream(outFile)
inputStream.copyTo(out, 1024) inputStream.copyTo(out)
out.close() out.close()
inputStream.close() inputStream.close()
} }
@@ -69,7 +70,7 @@ open class EcoLoadableJSONConfig(
@Throws(FileNotFoundException::class) @Throws(FileNotFoundException::class)
fun init(file: File) { fun init(file: File) {
super.init(handle.fromJson(FileReader(file), Map::class.java) as MutableMap<String, Any>) super.init(gson.fromJson(FileReader(file), Map::class.java) as MutableMap<String, Any>)
} }
override fun getName(): String { override fun getName(): String {
@@ -80,6 +81,10 @@ open class EcoLoadableJSONConfig(
return configFile return configFile
} }
override fun getBukkitHandle(): YamlConfiguration? {
return null
}
init { init {
val directory = File(this.plugin.dataFolder, subDirectoryPath) val directory = File(this.plugin.dataFolder, subDirectoryPath)
if (!directory.exists()) { if (!directory.exists()) {

View File

@@ -1,3 +1,5 @@
@file:Suppress("DEPRECATION")
package com.willfp.eco.internal.config.yaml package com.willfp.eco.internal.config.yaml
import com.willfp.eco.core.PluginLike import com.willfp.eco.core.PluginLike
@@ -40,11 +42,10 @@ open class EcoLoadableYamlConfig(
} }
if (!outFile.exists()) { if (!outFile.exists()) {
val out: OutputStream = FileOutputStream(outFile) val out: OutputStream = FileOutputStream(outFile)
inputStream.copyTo(out, 1024) inputStream.copyTo(out)
out.close() out.close()
inputStream.close() inputStream.close()
} }
plugin.configHandler.addConfig(this)
} }
override fun getResourcePath(): String { override fun getResourcePath(): String {
@@ -61,10 +62,6 @@ open class EcoLoadableYamlConfig(
handle.save(getConfigFile()) handle.save(getConfigFile())
} }
override fun getBukkitHandle(): YamlConfiguration {
return handle
}
override fun getName(): String { override fun getName(): String {
return name return name
} }
@@ -73,6 +70,10 @@ open class EcoLoadableYamlConfig(
return configFile return configFile
} }
override fun getBukkitHandle(): YamlConfiguration? {
return handle
}
init { init {
val directory = File(this.plugin.dataFolder, subDirectoryPath) val directory = File(this.plugin.dataFolder, subDirectoryPath)
if (!directory.exists()) { if (!directory.exists()) {

View File

@@ -1,5 +1,6 @@
package com.willfp.eco.internal.config.yaml package com.willfp.eco.internal.config.yaml
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.config.interfaces.Config import com.willfp.eco.core.config.interfaces.Config
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import org.bukkit.configuration.ConfigurationSection import org.bukkit.configuration.ConfigurationSection
@@ -286,6 +287,10 @@ open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
} }
} }
override fun getType(): ConfigType {
return ConfigType.JSON
}
override fun clone(): Config { override fun clone(): Config {
return EcoYamlConfigSection( return EcoYamlConfigSection(
YamlConfiguration.loadConfiguration( YamlConfiguration.loadConfiguration(

View File

@@ -1,6 +1,8 @@
package com.willfp.eco.internal.drops.impl package com.willfp.eco.internal.drops.impl
import com.willfp.eco.core.drops.InternalDropQueue import com.willfp.eco.core.drops.InternalDropQueue
import com.willfp.eco.core.events.DropQueuePushEvent
import com.willfp.eco.core.integrations.antigrief.AntigriefManager
import com.willfp.eco.util.TelekinesisUtils import com.willfp.eco.util.TelekinesisUtils
import org.bukkit.Bukkit import org.bukkit.Bukkit
import org.bukkit.Location import org.bukkit.Location
@@ -15,7 +17,7 @@ import org.bukkit.util.Vector
open class EcoDropQueue(val player: Player) : InternalDropQueue { open class EcoDropQueue(val player: Player) : InternalDropQueue {
val items = mutableListOf<ItemStack>() val items = mutableListOf<ItemStack>()
var xp: Int = 0 var xp: Int = 0
var loc: Location var location: Location
var hasTelekinesis = false var hasTelekinesis = false
override fun addItem(item: ItemStack): InternalDropQueue { override fun addItem(item: ItemStack): InternalDropQueue {
@@ -34,7 +36,7 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
} }
override fun setLocation(location: Location): InternalDropQueue { override fun setLocation(location: Location): InternalDropQueue {
loc = location this.location = location
return this return this
} }
@@ -47,8 +49,20 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
if (!hasTelekinesis) { if (!hasTelekinesis) {
hasTelekinesis = TelekinesisUtils.testPlayer(player) hasTelekinesis = TelekinesisUtils.testPlayer(player)
} }
val world = loc.world!!
loc = loc.add(0.5, 0.5, 0.5) if (hasTelekinesis && !AntigriefManager.canPickupItem(player, location)) {
hasTelekinesis = false
}
val pushEvent = DropQueuePushEvent(player, items, location, xp, hasTelekinesis)
Bukkit.getServer().pluginManager.callEvent(pushEvent)
if (pushEvent.isCancelled) {
return
}
val world = location.world!!
location = location.add(0.5, 0.5, 0.5)
items.removeIf { itemStack: ItemStack -> itemStack.type == Material.AIR } items.removeIf { itemStack: ItemStack -> itemStack.type == Material.AIR }
if (items.isEmpty()) { if (items.isEmpty()) {
return return
@@ -56,7 +70,7 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
if (hasTelekinesis) { if (hasTelekinesis) {
val leftover = player.inventory.addItem(*items.toTypedArray()) val leftover = player.inventory.addItem(*items.toTypedArray())
for (drop in leftover.values) { for (drop in leftover.values) {
world.dropItem(loc, drop!!).velocity = Vector() world.dropItem(location, drop!!).velocity = Vector()
} }
if (xp > 0) { if (xp > 0) {
val event = PlayerExpChangeEvent(player, xp) val event = PlayerExpChangeEvent(player, xp)
@@ -68,16 +82,16 @@ open class EcoDropQueue(val player: Player) : InternalDropQueue {
} }
} else { } else {
for (drop in items) { for (drop in items) {
world.dropItem(loc, drop).velocity = Vector() world.dropItem(location, drop).velocity = Vector()
} }
if (xp > 0) { if (xp > 0) {
val orb = world.spawnEntity(loc, EntityType.EXPERIENCE_ORB) as ExperienceOrb val orb = world.spawnEntity(location, EntityType.EXPERIENCE_ORB) as ExperienceOrb
orb.experience = xp orb.experience = xp
} }
} }
} }
init { init {
loc = player.location location = player.location
} }
} }

View File

@@ -10,10 +10,10 @@ class EcoFastCollatedDropQueue(player: Player) : EcoDropQueue(player) {
val fetched = COLLATED_MAP[player] val fetched = COLLATED_MAP[player]
if (fetched == null) { if (fetched == null) {
COLLATED_MAP[player] = CollatedDrops(items, loc, xp, hasTelekinesis) COLLATED_MAP[player] = CollatedDrops(items, location, xp, hasTelekinesis)
} else { } else {
fetched.addDrops(items) fetched.addDrops(items)
fetched.location = loc fetched.location = location
fetched.addXp(xp) fetched.addXp(xp)
if (this.hasTelekinesis) { if (this.hasTelekinesis) {
fetched.forceTelekinesis() fetched.forceTelekinesis()

View File

@@ -2,7 +2,7 @@ package com.willfp.eco.internal.extensions
import com.google.common.collect.ImmutableSet import com.google.common.collect.ImmutableSet
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.config.yaml.YamlTransientConfig import com.willfp.eco.core.config.TransientConfig
import com.willfp.eco.core.extensions.Extension import com.willfp.eco.core.extensions.Extension
import com.willfp.eco.core.extensions.ExtensionLoader import com.willfp.eco.core.extensions.ExtensionLoader
import com.willfp.eco.core.extensions.ExtensionMetadata import com.willfp.eco.core.extensions.ExtensionMetadata
@@ -54,7 +54,7 @@ class EcoExtensionLoader(
val ymlIn = classLoader.getResourceAsStream("extension.yml") val ymlIn = classLoader.getResourceAsStream("extension.yml")
?: throw MalformedExtensionException("No extension.yml found in " + extensionJar.name) ?: throw MalformedExtensionException("No extension.yml found in " + extensionJar.name)
val extensionYml = YamlTransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn))) val extensionYml = TransientConfig(YamlConfiguration.loadConfiguration(InputStreamReader(ymlIn)))
val mainClass = extensionYml.getStringOrNull("main") val mainClass = extensionYml.getStringOrNull("main")
var name = extensionYml.getStringOrNull("name") var name = extensionYml.getStringOrNull("name")

View File

@@ -1,8 +1,8 @@
package com.willfp.eco.internal.gui.menu package com.willfp.eco.internal.gui.menu
import com.willfp.eco.internal.gui.slot.EcoCaptivatorSlot
import com.willfp.eco.util.MenuUtils import com.willfp.eco.util.MenuUtils
import com.willfp.eco.util.StringUtils import com.willfp.eco.util.StringUtils
import org.bukkit.Material
import org.bukkit.NamespacedKey import org.bukkit.NamespacedKey
import org.bukkit.entity.Player import org.bukkit.entity.Player
import org.bukkit.inventory.Inventory import org.bukkit.inventory.Inventory
@@ -20,12 +20,14 @@ class ExtendedInventory(
for (i in 0 until inventory.size) { for (i in 0 until inventory.size) {
val (row, column) = MenuUtils.convertSlotToRowColumn(i) val (row, column) = MenuUtils.convertSlotToRowColumn(i)
val slot = menu.getSlot(row, column) val slot = menu.getSlot(row, column)
if (slot is EcoCaptivatorSlot) { if (slot.isCaptive) {
val defaultItem = slot.getItemStack(player) val defaultItem = slot.getItemStack(player)
val item = inventory.getItem(i) ?: continue val item = inventory.getItem(i) ?: continue
if (item != defaultItem) { if (item == defaultItem && item.type == Material.AIR) {
captiveItems.add(item) continue
} }
captiveItems.add(item)
} }
} }

View File

@@ -1,28 +0,0 @@
package com.willfp.eco.internal.gui.slot
import com.willfp.eco.core.Eco
import com.willfp.eco.core.gui.slot.functional.SlotHandler
import org.bukkit.Material
import org.bukkit.inventory.ItemStack
class EcoCaptivatorSlot : EcoSlot(
{ _, _ -> ItemStack(Material.AIR) },
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem,
{ _, _, _ -> }
) {
companion object {
val plugin = Eco.getHandler().ecoPlugin
val allowMovingItem = SlotHandler { event, _, _ ->
event.isCancelled = false
}
}
override fun isCaptive(): Boolean {
return true
}
}

View File

@@ -0,0 +1,24 @@
package com.willfp.eco.internal.gui.slot
import com.willfp.eco.core.gui.slot.functional.SlotHandler
import com.willfp.eco.core.gui.slot.functional.SlotProvider
class EcoCaptiveSlot(
provider: SlotProvider
) : EcoSlot(
provider,
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem,
allowMovingItem,
{ _, _, _ -> }
) {
override fun isCaptive(): Boolean {
return true
}
}
private val allowMovingItem = SlotHandler { event, _, _ ->
event.isCancelled = false
}

View File

@@ -31,8 +31,7 @@ open class EcoSlot(
ClickType.SHIFT_LEFT -> this.onShiftLeftClick.handle(event, this, menu) ClickType.SHIFT_LEFT -> this.onShiftLeftClick.handle(event, this, menu)
ClickType.SHIFT_RIGHT -> this.onShiftRightClick.handle(event, this, menu) ClickType.SHIFT_RIGHT -> this.onShiftRightClick.handle(event, this, menu)
ClickType.MIDDLE -> this.onMiddleClick.handle(event, this, menu) ClickType.MIDDLE -> this.onMiddleClick.handle(event, this, menu)
else -> { else -> {}
}
} }
} }

View File

@@ -58,7 +58,7 @@ class EcoSlotBuilder(private val provider: SlotProvider) : SlotBuilder {
override fun build(): Slot { override fun build(): Slot {
return if (captive) { return if (captive) {
EcoCaptivatorSlot() EcoCaptiveSlot(provider)
} else { } else {
EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, modifier) EcoSlot(provider, onLeftClick, onRightClick, onShiftLeftClick, onShiftRightClick, onMiddleClick, modifier)
} }

View File

@@ -23,7 +23,7 @@ class ArgParserColor : LookupArgParser {
if (argSplit.size < 2) { if (argSplit.size < 2) {
continue continue
} }
color = argSplit[1] color = argSplit[1].replace("#","")
} }
color ?: return null color ?: return null

View File

@@ -28,6 +28,10 @@ class ArgParserEnchantment : LookupArgParser {
} }
} }
if (enchants.isEmpty()) {
return null
}
for ((enchant, level) in enchants) { for ((enchant, level) in enchants) {
if (meta is EnchantmentStorageMeta) { if (meta is EnchantmentStorageMeta) {
meta.addStoredEnchant(enchant, level, true) meta.addStoredEnchant(enchant, level, true)

View File

@@ -1,7 +1,6 @@
package com.willfp.eco.internal.proxy package com.willfp.eco.internal.proxy
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.core.proxy.AbstractProxy
import com.willfp.eco.core.proxy.ProxyConstants import com.willfp.eco.core.proxy.ProxyConstants
import com.willfp.eco.core.proxy.ProxyFactory import com.willfp.eco.core.proxy.ProxyFactory
import com.willfp.eco.core.proxy.exceptions.ProxyError import com.willfp.eco.core.proxy.exceptions.ProxyError
@@ -13,9 +12,9 @@ class EcoProxyFactory(
private val plugin: EcoPlugin private val plugin: EcoPlugin
) : ProxyFactory { ) : ProxyFactory {
private val proxyClassLoader: ClassLoader = plugin::class.java.classLoader private val proxyClassLoader: ClassLoader = plugin::class.java.classLoader
private val cache: MutableMap<Class<out AbstractProxy>, AbstractProxy> = IdentityHashMap() private val cache: MutableMap<Class<out Any>, Any> = IdentityHashMap()
override fun <T : AbstractProxy> getProxy(proxyClass: Class<T>): T { override fun <T : Any> getProxy(proxyClass: Class<T>): T {
try { try {
val cachedProxy: T? = attemptCache(proxyClass) val cachedProxy: T? = attemptCache(proxyClass)
if (cachedProxy != null) { if (cachedProxy != null) {
@@ -53,7 +52,7 @@ class EcoProxyFactory(
} }
} }
private fun <T : AbstractProxy> attemptCache(proxyClass: Class<T>): T? { private fun <T : Any> attemptCache(proxyClass: Class<T>): T? {
val proxy = cache[proxyClass] ?: return null val proxy = cache[proxyClass] ?: return null
if (proxyClass.isInstance(proxy)) { if (proxyClass.isInstance(proxy)) {

View File

@@ -2,7 +2,6 @@ group 'com.willfp'
version rootProject.version version rootProject.version
dependencies { dependencies {
implementation 'org.bstats:bstats-bukkit:1.7'
implementation('net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT') { implementation('net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT') {
exclude group: 'net.kyori', module: 'adventure-api' exclude group: 'net.kyori', module: 'adventure-api'
} }
@@ -40,6 +39,7 @@ dependencies {
compileOnly 'com.iridium:IridiumSkyblock:3.1.2' compileOnly 'com.iridium:IridiumSkyblock:3.1.2'
compileOnly 'com.github.WillFP:CrashClaim:1.0.19' compileOnly 'com.github.WillFP:CrashClaim:1.0.19'
compileOnly 'com.wolfyscript.wolfyutilities:wolfyutilities:1.7.8.1' compileOnly 'com.wolfyscript.wolfyutilities:wolfyutilities:1.7.8.1'
compileOnly 'com.github.decentsoftware-eu:decentholograms:2.1.2'
// CombatLogX V10 + NewbieHelper Expansion // CombatLogX V10 + NewbieHelper Expansion
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT' compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'

View File

@@ -12,6 +12,7 @@ import com.willfp.eco.core.recipe.recipes.CraftingRecipe;
import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe; import com.willfp.eco.core.recipe.recipes.ShapedCraftingRecipe;
import org.bukkit.Keyed; import org.bukkit.Keyed;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.entity.Player;
import org.bukkit.event.Event; import org.bukkit.event.Event;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@@ -28,6 +29,29 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
super(plugin); super(plugin);
} }
private void allow(@NotNull final Event event,
@NotNull final CraftingRecipe recipe) {
if (event instanceof PrepareItemCraftEvent) {
((PrepareItemCraftEvent) event).getInventory().setResult(recipe.getOutput());
}
if (event instanceof CraftItemEvent) {
((CraftItemEvent) event).getInventory().setResult(recipe.getOutput());
}
}
private void deny(@NotNull final Event event) {
if (event instanceof PrepareItemCraftEvent) {
((PrepareItemCraftEvent) event).getInventory().setResult(new ItemStack(Material.AIR));
}
if (event instanceof CraftItemEvent) {
((CraftItemEvent) event).getInventory().setResult(new ItemStack(Material.AIR));
((CraftItemEvent) event).setResult(Event.Result.DENY);
((CraftItemEvent) event).setCancelled(true);
}
}
@EventHandler @EventHandler
public void complexRecipeListener(@NotNull final PrepareItemCraftEvent event) { public void complexRecipeListener(@NotNull final PrepareItemCraftEvent event) {
if (!(event.getRecipe() instanceof ShapedRecipe recipe)) { if (!(event.getRecipe() instanceof ShapedRecipe recipe)) {
@@ -38,18 +62,30 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
return; return;
} }
if (!(event.getInventory().getViewers().get(0) instanceof Player player)) {
return;
}
ItemStack[] matrix = event.getInventory().getMatrix(); ItemStack[] matrix = event.getInventory().getMatrix();
CraftingRecipe matched = Recipes.getMatch(matrix); CraftingRecipe matched = Recipes.getMatch(matrix);
if (matched == null) { if (matched == null) {
event.getInventory().setResult(new ItemStack(Material.AIR)); deny(event);
return; return;
} }
if (matched.test(matrix)) { if (matched.test(matrix)) {
event.getInventory().setResult(matched.getOutput()); if (matched.getPermission() != null) {
if (player.hasPermission(matched.getPermission())) {
allow(event, matched);
} else {
deny(event);
}
} else {
allow(event, matched);
}
} else { } else {
event.getInventory().setResult(new ItemStack(Material.AIR)); deny(event);
} }
} }
@@ -63,22 +99,30 @@ public class ShapedRecipeListener extends PluginDependent<EcoPlugin> implements
return; return;
} }
if (!(event.getInventory().getViewers().get(0) instanceof Player player)) {
return;
}
ItemStack[] matrix = event.getInventory().getMatrix(); ItemStack[] matrix = event.getInventory().getMatrix();
CraftingRecipe matched = Recipes.getMatch(matrix); CraftingRecipe matched = Recipes.getMatch(matrix);
if (matched == null) { if (matched == null) {
event.getInventory().setResult(new ItemStack(Material.AIR)); deny(event);
event.setResult(Event.Result.DENY);
event.setCancelled(true);
return; return;
} }
if (matched.test(matrix)) { if (matched.test(matrix)) {
event.getInventory().setResult(matched.getOutput()); if (matched.getPermission() != null) {
if (player.hasPermission(matched.getPermission())) {
allow(event, matched);
} else {
deny(event);
}
} else {
allow(event, matched);
}
} else { } else {
event.getInventory().setResult(new ItemStack(Material.AIR)); deny(event);
event.setResult(Event.Result.DENY);
event.setCancelled(true);
} }
} }

View File

@@ -31,7 +31,7 @@ import org.bukkit.inventory.ItemStack
import java.util.logging.Logger import java.util.logging.Logger
@Suppress("UNUSED") @Suppress("UNUSED")
class EcoHandler : com.willfp.eco.internal.spigot.EcoSpigotPlugin(), Handler { class EcoHandler : EcoSpigotPlugin(), Handler {
private val cleaner = EcoCleaner() private val cleaner = EcoCleaner()
private val requirementFactory = EcoRequirementFactory() private val requirementFactory = EcoRequirementFactory()
private var adventure: BukkitAudiences? = null private var adventure: BukkitAudiences? = null
@@ -118,7 +118,7 @@ class EcoHandler : com.willfp.eco.internal.spigot.EcoSpigotPlugin(), Handler {
} }
override fun registerBStats(plugin: EcoPlugin) { override fun registerBStats(plugin: EcoPlugin) {
MetricHandler.createMetrics(plugin, this.ecoPlugin) MetricHandler.createMetrics(plugin)
} }
override fun getRequirementFactory(): EcoRequirementFactory { override fun getRequirementFactory(): EcoRequirementFactory {

View File

@@ -39,7 +39,8 @@ import com.willfp.eco.internal.spigot.display.frame.clearFrames
import com.willfp.eco.internal.spigot.drops.CollatedRunnable import com.willfp.eco.internal.spigot.drops.CollatedRunnable
import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners import com.willfp.eco.internal.spigot.eventlisteners.EntityDeathByEntityListeners
import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListeners import com.willfp.eco.internal.spigot.eventlisteners.NaturalExpGainListeners
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListeners import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersPaper
import com.willfp.eco.internal.spigot.eventlisteners.PlayerJumpListenersSpigot
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorChangeEventListeners
import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener import com.willfp.eco.internal.spigot.eventlisteners.armor.ArmorListener
import com.willfp.eco.internal.spigot.gui.GUIListener import com.willfp.eco.internal.spigot.gui.GUIListener
@@ -69,6 +70,7 @@ import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsItemsA
import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen import com.willfp.eco.internal.spigot.integrations.customitems.CustomItemsOraxen
import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault import com.willfp.eco.internal.spigot.integrations.economy.EconomyVault
import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI import com.willfp.eco.internal.spigot.integrations.hologram.HologramCMI
import com.willfp.eco.internal.spigot.integrations.hologram.HologramDecentHolograms
import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays import com.willfp.eco.internal.spigot.integrations.hologram.HologramHolographicDisplays
import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl import com.willfp.eco.internal.spigot.integrations.mcmmo.McmmoIntegrationImpl
import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration import com.willfp.eco.internal.spigot.integrations.multiverseinventories.MultiverseInventoriesIntegration
@@ -131,20 +133,6 @@ abstract class EcoSpigotPlugin : EcoPlugin(
this.logger.info("Ignore messages about deprecated events!") this.logger.info("Ignore messages about deprecated events!")
if (!this.configYml.getBool("enable-bstats")) {
logger.severe("")
logger.severe("----------------------------")
logger.severe("")
logger.severe("Looks like you've disabled bStats!")
logger.severe("This means that information about java version,")
logger.severe("player count, server version, and other data")
logger.severe("isn't able to be used to ensure that support isn't dropped!")
logger.severe("Enable bStats in /plugins/eco/config.yml")
logger.severe("")
logger.severe("----------------------------")
logger.severe("")
}
// Init FIS // Init FIS
this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap() this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap()
} }
@@ -218,6 +206,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
// Hologram // Hologram
IntegrationLoader("HolographicDisplays") { HologramManager.register(HologramHolographicDisplays(this)) }, IntegrationLoader("HolographicDisplays") { HologramManager.register(HologramHolographicDisplays(this)) },
IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) }, IntegrationLoader("CMI") { HologramManager.register(HologramCMI()) },
IntegrationLoader("DecentHolograms") { HologramManager.register(HologramDecentHolograms()) },
//IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) }, //IntegrationLoader("GHolo") { HologramManager.register(HologramGHolo()) },
// AFK // AFK
@@ -255,17 +244,24 @@ abstract class EcoSpigotPlugin : EcoPlugin(
} }
override fun loadListeners(): List<Listener> { override fun loadListeners(): List<Listener> {
return listOf( val listeners = mutableListOf(
NaturalExpGainListeners(), NaturalExpGainListeners(),
ArmorListener(), ArmorListener(),
EntityDeathByEntityListeners(this), EntityDeathByEntityListeners(this),
ShapedRecipeListener(this), ShapedRecipeListener(this),
PlayerJumpListeners(),
GUIListener(this), GUIListener(this),
ArrowDataListener(this), ArrowDataListener(this),
ArmorChangeEventListeners(this), ArmorChangeEventListeners(this),
DataListener(this), DataListener(this),
PlayerBlockListener(this) PlayerBlockListener(this)
) )
if (Prerequisite.HAS_PAPER.isMet) {
listeners.add(PlayerJumpListenersPaper())
} else {
listeners.add(PlayerJumpListenersSpigot())
}
return listeners
} }
} }

View File

@@ -4,6 +4,7 @@ import com.willfp.eco.core.Eco
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.util.PlayerUtils import com.willfp.eco.util.PlayerUtils
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.player.PlayerJoinEvent import org.bukkit.event.player.PlayerJoinEvent
import org.bukkit.event.player.PlayerLoginEvent import org.bukkit.event.player.PlayerLoginEvent
@@ -12,19 +13,19 @@ import org.bukkit.event.player.PlayerQuitEvent
class DataListener( class DataListener(
private val plugin: EcoPlugin private val plugin: EcoPlugin
) : Listener { ) : Listener {
@EventHandler @EventHandler(priority = EventPriority.HIGHEST)
fun onLeave(event: PlayerQuitEvent) { fun onLeave(event: PlayerQuitEvent) {
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId) Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
} }
@EventHandler @EventHandler
fun onJoin(event: PlayerJoinEvent) { fun onJoin(event: PlayerJoinEvent) {
plugin.scheduler.runLater({ plugin.scheduler.runLater(5) {
PlayerUtils.updateSavedDisplayName(event.player) PlayerUtils.updateSavedDisplayName(event.player)
}, 5) }
} }
@EventHandler @EventHandler(priority = EventPriority.LOWEST)
fun onLogin(event: PlayerLoginEvent) { fun onLogin(event: PlayerLoginEvent) {
Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId) Eco.getHandler().playerProfileHandler.unloadPlayer(event.player.uniqueId)
} }

View File

@@ -1,12 +1,16 @@
package com.willfp.eco.internal.spigot.data package com.willfp.eco.internal.spigot.data
import com.willfp.eco.core.EcoPlugin import com.willfp.eco.core.EcoPlugin
import com.willfp.eco.util.BlockUtils
import org.bukkit.Location
import org.bukkit.block.Block import org.bukkit.block.Block
import org.bukkit.event.EventHandler import org.bukkit.event.EventHandler
import org.bukkit.event.EventPriority import org.bukkit.event.EventPriority
import org.bukkit.event.Listener import org.bukkit.event.Listener
import org.bukkit.event.block.BlockBreakEvent import org.bukkit.event.block.BlockBreakEvent
import org.bukkit.event.block.BlockMultiPlaceEvent import org.bukkit.event.block.BlockMultiPlaceEvent
import org.bukkit.event.block.BlockPistonExtendEvent
import org.bukkit.event.block.BlockPistonRetractEvent
import org.bukkit.event.block.BlockPlaceEvent import org.bukkit.event.block.BlockPlaceEvent
import org.bukkit.persistence.PersistentDataType import org.bukkit.persistence.PersistentDataType
@@ -36,9 +40,59 @@ class PlayerBlockListener(
} }
} }
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onExtend(event: BlockPistonExtendEvent) {
val locs = mutableListOf<Location>()
val toRemove = mutableListOf<Location>()
for (block in event.blocks) {
if (BlockUtils.isPlayerPlaced(block)) {
locs.add(block.getRelative(event.direction).location)
toRemove.add(block.location)
}
}
this.plugin.scheduler.run {
for (loc in toRemove) {
removeKey(loc)
}
for (loc in locs) {
writeKey(loc)
}
}
}
@EventHandler(priority = EventPriority.MONITOR, ignoreCancelled = true)
fun onRetract(event: BlockPistonRetractEvent) {
val locs = mutableListOf<Location>()
val toRemove = mutableListOf<Location>()
for (block in event.blocks) {
if (BlockUtils.isPlayerPlaced(block)) {
locs.add(block.getRelative(event.direction).location)
toRemove.add(block.location)
}
}
this.plugin.scheduler.run {
for (loc in toRemove) {
removeKey(loc)
}
for (loc in locs) {
writeKey(loc)
}
}
}
private fun writeKey(block: Block) { private fun writeKey(block: Block) {
val loc = block.location.hashCode().toString(16) writeKey(block.location)
block.chunk.persistentDataContainer.set( }
private fun writeKey(location: Location) {
val loc = location.hashCode().toString(16)
location.chunk.persistentDataContainer.set(
plugin.namespacedKeyFactory.create(loc.lowercase()), plugin.namespacedKeyFactory.create(loc.lowercase()),
PersistentDataType.INTEGER, PersistentDataType.INTEGER,
1 1
@@ -46,7 +100,11 @@ class PlayerBlockListener(
} }
private fun removeKey(block: Block) { private fun removeKey(block: Block) {
val loc = block.location.hashCode().toString(16) removeKey(block.location)
block.chunk.persistentDataContainer.remove(plugin.namespacedKeyFactory.create(loc.lowercase())) }
private fun removeKey(location: Location) {
val loc = location.hashCode().toString(16)
location.chunk.persistentDataContainer.remove(plugin.namespacedKeyFactory.create(loc.lowercase()))
} }
} }

View File

@@ -1,6 +1,7 @@
package com.willfp.eco.internal.spigot.data.storage package com.willfp.eco.internal.spigot.data.storage
import com.willfp.eco.core.config.yaml.YamlBaseConfig import com.willfp.eco.core.config.BaseConfig
import com.willfp.eco.core.config.ConfigType
import com.willfp.eco.core.data.PlayerProfile import com.willfp.eco.core.data.PlayerProfile
import com.willfp.eco.core.data.keys.PersistentDataKey import com.willfp.eco.core.data.keys.PersistentDataKey
import com.willfp.eco.internal.spigot.EcoSpigotPlugin import com.willfp.eco.internal.spigot.EcoSpigotPlugin
@@ -43,9 +44,10 @@ class YamlDataHandler(
class DataYml( class DataYml(
plugin: EcoSpigotPlugin plugin: EcoSpigotPlugin
) : YamlBaseConfig( ) : BaseConfig(
"data", "data",
plugin,
false, false,
plugin ConfigType.YAML
) )
} }

View File

@@ -30,9 +30,9 @@ class EntityDeathByEntityListeners(
builtEvent.victim = victim builtEvent.victim = victim
builtEvent.damager = event.damager builtEvent.damager = event.damager
events.add(builtEvent) events.add(builtEvent)
this.plugin.scheduler.runLater({ this.plugin.scheduler.run {
events.remove(builtEvent) events.remove(builtEvent)
}, 1) }
} }
@EventHandler @EventHandler

View File

@@ -12,7 +12,7 @@ import java.text.DecimalFormat
import java.util.UUID import java.util.UUID
@Suppress("DEPRECATION") @Suppress("DEPRECATION")
class PlayerJumpListeners : Listener { class PlayerJumpListenersSpigot : Listener {
@EventHandler(ignoreCancelled = true) @EventHandler(ignoreCancelled = true)
fun onJump(event: PlayerMoveEvent) { fun onJump(event: PlayerMoveEvent) {
if (McmmoManager.isFake(event)) { if (McmmoManager.isFake(event)) {
@@ -44,3 +44,14 @@ class PlayerJumpListeners : Listener {
private val FORMAT = DecimalFormat("0.00") private val FORMAT = DecimalFormat("0.00")
} }
} }
class PlayerJumpListenersPaper : Listener {
@EventHandler(ignoreCancelled = true)
fun onJump(event: com.destroystokyo.paper.event.player.PlayerJumpEvent) {
Bukkit.getPluginManager().callEvent(
PlayerJumpEvent(
PlayerMoveEvent(event.player, event.from, event.to)
)
)
}
}

View File

@@ -57,6 +57,11 @@ class AntigriefBentoBox : AntigriefWrapper {
} }
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
val island = BentoBox.getInstance().islandsManager.getIslandAt(location).orElse(null) ?: return true
return island.isAllowed(User.getInstance(player), Flags.ITEM_PICKUP)
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "BentoBox" return "BentoBox"
} }

View File

@@ -55,6 +55,10 @@ class AntigriefCombatLogXV10 : AntigriefWrapper {
return true return true
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "CombatLogX" return "CombatLogX"
} }

View File

@@ -58,6 +58,10 @@ class AntigriefCombatLogXV11 : AntigriefWrapper {
return true return true
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "CombatLogX" return "CombatLogX"
} }

View File

@@ -48,6 +48,10 @@ class AntigriefCrashClaim : AntigriefWrapper {
} }
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "CrashClaim" return "CrashClaim"
} }

View File

@@ -31,4 +31,8 @@ class AntigriefDeluxeCombat: AntigriefWrapper {
else -> true else -> true
} }
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
} }

View File

@@ -65,6 +65,10 @@ class AntigriefFactionsUUID : AntigriefWrapper {
return true return true
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "FactionsUUID" return "FactionsUUID"
} }

View File

@@ -51,6 +51,10 @@ class AntigriefGriefPrevention : AntigriefWrapper {
} }
} }
override fun canPickupItem(player: Player, location: Location): Boolean {
return true
}
override fun getPluginName(): String { override fun getPluginName(): String {
return "GriefPrevention" return "GriefPrevention"
} }

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