Compare commits
70 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
bf5766e61c | ||
|
|
38da5fe6d1 | ||
|
|
e16649873b | ||
|
|
a3b0b4f847 | ||
|
|
d9f1ddd188 | ||
|
|
14a4d9291b | ||
|
|
6630044546 | ||
|
|
1043981fe4 | ||
|
|
fb0b7c52cf | ||
|
|
74e5464f7d | ||
|
|
2ad1ff4cdb | ||
|
|
2d47c18be6 | ||
|
|
69e67be436 | ||
|
|
c144723d5b | ||
|
|
108375f545 | ||
|
|
83d5b3e96e | ||
|
|
37e09a470e | ||
|
|
1f064110b7 | ||
|
|
94a0b4de5d | ||
|
|
8a68666f86 | ||
|
|
2c218d1088 | ||
|
|
3fa95d82a6 | ||
|
|
9648b42c4d | ||
|
|
66887f0a3a | ||
|
|
410cdfe7e3 | ||
|
|
bbffdc7e23 | ||
|
|
0d267e2bec | ||
|
|
578256f89b | ||
|
|
90ecbfce00 | ||
|
|
9945704338 | ||
|
|
5c7a7876d8 | ||
|
|
94df0e67a6 | ||
|
|
92c4e62709 | ||
|
|
e094a1e934 | ||
|
|
26c07a20e7 | ||
|
|
ad68e1efef | ||
|
|
d8c3a3befa | ||
|
|
aa52dcdf94 | ||
|
|
9d3ba7ea88 | ||
|
|
e2b417af74 | ||
|
|
77394d3038 | ||
|
|
fcc7f82b38 | ||
|
|
396f4dac44 | ||
|
|
3341093735 | ||
|
|
714d04e48f | ||
|
|
73b7ccea3a | ||
|
|
606bf8fcd2 | ||
|
|
fbbf893d64 | ||
|
|
36001373eb | ||
|
|
9ac34288eb | ||
|
|
6345d1fe92 | ||
|
|
a7fa0ecf26 | ||
|
|
a65f16cfac | ||
|
|
49965c091b | ||
|
|
f9bc2aba99 | ||
|
|
5627582bd5 | ||
|
|
ab8065d06e | ||
|
|
444764e481 | ||
|
|
c240e94a6b | ||
|
|
9da28a1dff | ||
|
|
cf3c1f8394 | ||
|
|
f98befbdce | ||
|
|
d0d8ea07e4 | ||
|
|
109347a601 | ||
|
|
43bef762bf | ||
|
|
69a2e0e247 | ||
|
|
874a9b4f32 | ||
|
|
5690221c27 | ||
|
|
f19b143804 | ||
|
|
bbbf19c041 |
11
.github/dependabot.yml
vendored
Normal file
11
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,11 @@
|
||||
# To get started with Dependabot version updates, you'll need to specify which
|
||||
# package ecosystems to update and where the package manifests are located.
|
||||
# Please see the documentation for all configuration options:
|
||||
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||
|
||||
version: 2
|
||||
updates:
|
||||
- package-ecosystem: "gradle" # See documentation for possible values
|
||||
directory: "/" # Location of package manifests
|
||||
schedule:
|
||||
interval: "daily"
|
||||
@@ -16,7 +16,7 @@
|
||||
# Information for development
|
||||
|
||||
## Javadoc
|
||||
The 6.0.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.0.0/javadoc/)
|
||||
The 6.8.0 Javadoc can be found [here](https://javadoc.jitpack.io/com/willfp/eco/6.8.0/javadoc/)
|
||||
|
||||
## Plugin Information
|
||||
|
||||
@@ -31,7 +31,6 @@ depend:
|
||||
eco is available from any of these places:
|
||||
|
||||
- [GitHub](https://github.com/Auxilor/eco/releases)
|
||||
- [Spigot](https://www.spigotmc.org/resources/eco.87955/)
|
||||
- [Polymart](https://polymart.org/resource/eco.773)
|
||||
- [Build it locally](https://github.com/Auxilor/eco#build-locally).
|
||||
|
||||
@@ -72,7 +71,7 @@ Maven:
|
||||
</dependency>
|
||||
```
|
||||
|
||||
Replace `Tag` with a release tag for eco, eg `6.0.0`.
|
||||
Replace `Tag` with a release tag for eco, eg `6.8.0`.
|
||||
|
||||
## Build locally:
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ allprojects {
|
||||
|
||||
shadowJar {
|
||||
relocate('org.bstats', 'com.willfp.eco.shaded.bstats')
|
||||
relocate('net.kyori.adventure.text.minimessage', 'com.willfp.eco.shaded.minimessage')
|
||||
}
|
||||
|
||||
jar {
|
||||
|
||||
@@ -6,12 +6,14 @@ group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.7'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-gson:4.8.1'
|
||||
compileOnly 'net.kyori:adventure-text-serializer-legacy:4.8.1'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
}
|
||||
|
||||
java {
|
||||
|
||||
@@ -54,7 +54,7 @@ import java.util.stream.Collectors;
|
||||
@SuppressWarnings("unused")
|
||||
public abstract class EcoPlugin extends JavaPlugin {
|
||||
/**
|
||||
* The spigot resource ID of the plugin.
|
||||
* The polymart resource ID of the plugin.
|
||||
*/
|
||||
@Getter
|
||||
private final int resourceId;
|
||||
@@ -169,14 +169,14 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
private final ProxyFactory proxyFactory;
|
||||
|
||||
/**
|
||||
* Create a new plugin without a specified color, proxy support, spigot, or bStats.
|
||||
* Create a new plugin without a specified color, proxy support, polymart, or bStats.
|
||||
*/
|
||||
protected EcoPlugin() {
|
||||
this("&f");
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a new plugin without proxy support, spigot, or bStats.
|
||||
* Create a new plugin without proxy support, polymart, or bStats.
|
||||
*
|
||||
* @param color The color.
|
||||
*/
|
||||
@@ -186,7 +186,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
|
||||
|
||||
/**
|
||||
* Create a new plugin unlinked to spigot and bStats.
|
||||
* Create a new plugin unlinked to polymart and bStats.
|
||||
*
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
@@ -199,7 +199,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
/**
|
||||
* Create a new plugin without proxy or extension support.
|
||||
*
|
||||
* @param resourceId The spigot resource ID for the plugin.
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
*/
|
||||
@@ -212,7 +212,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
/**
|
||||
* Create a new plugin without proxy support.
|
||||
*
|
||||
* @param resourceId The spigot resource ID for the plugin.
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
* @param supportingExtensions If the plugin supports extensions.
|
||||
@@ -227,7 +227,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
/**
|
||||
* Create a new plugin without extension support.
|
||||
*
|
||||
* @param resourceId The spigot resource ID for the plugin.
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
@@ -242,7 +242,7 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
/**
|
||||
* Create a new plugin.
|
||||
*
|
||||
* @param resourceId The spigot resource ID for the plugin.
|
||||
* @param resourceId The polymart resource ID for the plugin.
|
||||
* @param bStatsId The bStats resource ID for the plugin.
|
||||
* @param proxyPackage The package where proxy implementations are stored.
|
||||
* @param color The color of the plugin (used in messages, using standard formatting)
|
||||
@@ -357,15 +357,18 @@ public abstract class EcoPlugin extends JavaPlugin {
|
||||
Eco.getHandler().registerBStats(this);
|
||||
}
|
||||
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins()).map(Plugin::getName).collect(Collectors.toSet());
|
||||
Set<String> enabledPlugins = Arrays.stream(Bukkit.getPluginManager().getPlugins())
|
||||
.map(Plugin::getName)
|
||||
.map(String::toLowerCase)
|
||||
.collect(Collectors.toSet());
|
||||
|
||||
if (enabledPlugins.contains("PlaceholderAPI")) {
|
||||
if (enabledPlugins.contains("PlaceholderAPI".toLowerCase())) {
|
||||
this.loadedIntegrations.add("PlaceholderAPI");
|
||||
PlaceholderManager.addIntegration(Eco.getHandler().createPAPIIntegration(this));
|
||||
}
|
||||
|
||||
this.loadIntegrationLoaders().forEach((integrationLoader -> {
|
||||
if (enabledPlugins.contains(integrationLoader.getPluginName())) {
|
||||
if (enabledPlugins.contains(integrationLoader.getPluginName().toLowerCase())) {
|
||||
this.loadedIntegrations.add(integrationLoader.getPluginName());
|
||||
integrationLoader.load();
|
||||
}
|
||||
|
||||
@@ -13,7 +13,9 @@ import com.willfp.eco.core.gui.GUIFactory;
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration;
|
||||
import com.willfp.eco.core.proxy.Cleaner;
|
||||
import com.willfp.eco.core.proxy.ProxyFactory;
|
||||
import com.willfp.eco.core.requirement.RequirementFactory;
|
||||
import com.willfp.eco.core.scheduling.Scheduler;
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
@@ -194,4 +196,20 @@ public interface Handler {
|
||||
* @param plugin The plugin.
|
||||
*/
|
||||
void registerBStats(@NotNull EcoPlugin plugin);
|
||||
|
||||
/**
|
||||
* Get the requirement factory.
|
||||
*
|
||||
* @return The factory.
|
||||
*/
|
||||
@NotNull
|
||||
RequirementFactory getRequirementFactory();
|
||||
|
||||
/**
|
||||
* Get Adventure audiences.
|
||||
*
|
||||
* @return The audiences.
|
||||
*/
|
||||
@NotNull
|
||||
BukkitAudiences getAdventure();
|
||||
}
|
||||
|
||||
@@ -0,0 +1,54 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in the plugin's base directory (eg config.json).
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class JSONBaseConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused, updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* @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.
|
||||
*/
|
||||
protected JSONBaseConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
"",
|
||||
plugin.getClass(),
|
||||
removeUnused
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
package com.willfp.eco.core.config.json;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import com.willfp.eco.core.EcoPlugin;
|
||||
import com.willfp.eco.core.config.json.wrapper.LoadableJSONConfigWrapper;
|
||||
import com.willfp.eco.core.config.yaml.wrapper.LoadableYamlConfigWrapper;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Config implementation for configs present in one of two places:
|
||||
* <ul>
|
||||
* <li>Plugin base directory (eg config.yml, lang.yml)</li>
|
||||
* <li>Other extension's configs</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Automatically updates.
|
||||
*/
|
||||
public abstract class JSONExtendableConfig extends LoadableJSONConfigWrapper {
|
||||
/**
|
||||
* @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 source The class that owns the resource.
|
||||
*/
|
||||
protected JSONExtendableConfig(@NotNull final String configName,
|
||||
final boolean removeUnused,
|
||||
@NotNull final EcoPlugin plugin,
|
||||
@NotNull final Class<?> source,
|
||||
@NotNull final String subDirectoryPath,
|
||||
@NotNull final String... updateBlacklist) {
|
||||
super(
|
||||
Eco.getHandler().getConfigFactory().createUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
updateBlacklist
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -30,6 +30,24 @@ public interface ConfigFactory {
|
||||
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 EcoPlugin plugin,
|
||||
@NotNull String subDirectoryPath,
|
||||
@NotNull Class<?> source,
|
||||
boolean removeUnused,
|
||||
@NotNull String... updateBlacklist);
|
||||
|
||||
/**
|
||||
* JSON loadable config.
|
||||
*
|
||||
|
||||
@@ -1,22 +1,12 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.persistence.PersistentDataContainer;
|
||||
import org.bukkit.persistence.PersistentDataType;
|
||||
import org.jetbrains.annotations.ApiStatus;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Utility class to manage client-side item display.
|
||||
*/
|
||||
@@ -28,29 +18,9 @@ public class Display {
|
||||
public static final String PREFIX = "§z";
|
||||
|
||||
/**
|
||||
* All registered display modules.
|
||||
* The display handler.
|
||||
*/
|
||||
private static final Map<DisplayPriority, List<DisplayModule>> MODULES = new HashMap<>();
|
||||
|
||||
/**
|
||||
* NamespacedKey for finalizing.
|
||||
*/
|
||||
private static NamespacedKey finalizeKey = null;
|
||||
|
||||
/**
|
||||
* Register display module.
|
||||
*
|
||||
* @param module The module.
|
||||
*/
|
||||
public void registerDisplayModule(@NotNull final DisplayModule module) {
|
||||
List<DisplayModule> modules = MODULES.get(module.getPriority());
|
||||
|
||||
modules.removeIf(module1 -> module1.getPluginName().equalsIgnoreCase(module.getPluginName()));
|
||||
|
||||
modules.add(module);
|
||||
|
||||
MODULES.put(module.getPriority(), modules);
|
||||
}
|
||||
public static DisplayHandler handler = null;
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
@@ -71,35 +41,7 @@ public class Display {
|
||||
*/
|
||||
public ItemStack display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player) {
|
||||
Map<String, Object[]> pluginVarArgs = new HashMap<>();
|
||||
|
||||
for (DisplayPriority priority : DisplayPriority.values()) {
|
||||
List<DisplayModule> modules = MODULES.get(priority);
|
||||
for (DisplayModule module : modules) {
|
||||
pluginVarArgs.put(module.getPluginName(), module.generateVarArgs(itemStack));
|
||||
}
|
||||
}
|
||||
|
||||
revert(itemStack);
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
|
||||
if (meta == null) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
for (DisplayPriority priority : DisplayPriority.values()) {
|
||||
List<DisplayModule> modules = MODULES.get(priority);
|
||||
for (DisplayModule module : modules) {
|
||||
Object[] varargs = pluginVarArgs.get(module.getPluginName());
|
||||
module.display(itemStack, varargs);
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, varargs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
return handler.display(itemStack, player);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -131,31 +73,7 @@ public class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack revert(@NotNull final ItemStack itemStack) {
|
||||
if (Display.isFinalized(itemStack)) {
|
||||
unfinalize(itemStack);
|
||||
}
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
|
||||
if (meta == null) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
List<String> lore = meta.getLore();
|
||||
|
||||
if (lore != null && lore.removeIf(line -> line.startsWith(Display.PREFIX))) { // only apply lore modification if needed
|
||||
meta.setLore(lore);
|
||||
itemStack.setItemMeta(meta);
|
||||
}
|
||||
|
||||
for (DisplayPriority priority : DisplayPriority.values()) {
|
||||
List<DisplayModule> modules = MODULES.get(priority);
|
||||
for (DisplayModule module : modules) {
|
||||
module.revert(itemStack);
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack;
|
||||
return handler.revert(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -165,21 +83,7 @@ public class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack finalize(@NotNull final ItemStack itemStack) {
|
||||
Validate.notNull(finalizeKey, "Key cannot be null!");
|
||||
|
||||
if (itemStack.getType().getMaxStackSize() > 1) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
if (meta == null) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
PersistentDataContainer container = meta.getPersistentDataContainer();
|
||||
container.set(finalizeKey, PersistentDataType.INTEGER, 1);
|
||||
itemStack.setItemMeta(meta);
|
||||
return itemStack;
|
||||
return handler.finalize(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,18 +93,7 @@ public class Display {
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
public ItemStack unfinalize(@NotNull final ItemStack itemStack) {
|
||||
Validate.notNull(finalizeKey, "Key cannot be null!");
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
|
||||
if (meta == null) {
|
||||
return itemStack;
|
||||
}
|
||||
|
||||
PersistentDataContainer container = meta.getPersistentDataContainer();
|
||||
container.remove(finalizeKey);
|
||||
itemStack.setItemMeta(meta);
|
||||
return itemStack;
|
||||
return handler.unfinalize(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -210,31 +103,61 @@ public class Display {
|
||||
* @return If finalized.
|
||||
*/
|
||||
public boolean isFinalized(@NotNull final ItemStack itemStack) {
|
||||
Validate.notNull(finalizeKey, "Key cannot be null!");
|
||||
|
||||
ItemMeta meta = itemStack.getItemMeta();
|
||||
|
||||
if (meta == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
PersistentDataContainer container = meta.getPersistentDataContainer();
|
||||
return container.has(finalizeKey, PersistentDataType.INTEGER);
|
||||
return handler.isFinalized(itemStack);
|
||||
}
|
||||
|
||||
/**
|
||||
* Set key to be used for finalization.
|
||||
* Register a new display module.
|
||||
*
|
||||
* @param finalizeKey The key.
|
||||
* @param module The module.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void setFinalizeKey(@NotNull final NamespacedKey finalizeKey) {
|
||||
Display.finalizeKey = finalizeKey;
|
||||
public void registerDisplayModule(@NotNull final DisplayModule module) {
|
||||
handler.registerDisplayModule(module);
|
||||
}
|
||||
|
||||
static {
|
||||
for (DisplayPriority priority : DisplayPriority.values()) {
|
||||
MODULES.put(priority, new ArrayList<>());
|
||||
/**
|
||||
* Initialize the display system.
|
||||
*
|
||||
* @param handler The handler.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void init(@NotNull final DisplayHandler handler) {
|
||||
if (Display.handler != null) {
|
||||
throw new IllegalArgumentException("Already Initialized!");
|
||||
}
|
||||
Display.handler = handler;
|
||||
}
|
||||
|
||||
/**
|
||||
* Extremely janky method - also internal, so don't use it. <b>This method is
|
||||
* NOT part of the API and may be removed at any time!</b>
|
||||
* <p>
|
||||
* This calls a display module with the specified parameters, now
|
||||
* you might ask why I need a static java method when the DisplayHandler
|
||||
* implementation could just call it itself? Well, kotlin doesn't really
|
||||
* like dealing with vararg ambiguity, and so while kotlin can't figure out
|
||||
* what is and isn't a vararg when I call display with a player, java can.
|
||||
* <p>
|
||||
* Because of this, I need to have this part of the code in java.
|
||||
*
|
||||
* <b>Don't call this method as part of your plugins!</b>
|
||||
* <p>
|
||||
* No, seriously - don't. This skips a bunch of checks and you'll almost
|
||||
* definitely break something.
|
||||
*
|
||||
* @param module The display module.
|
||||
* @param itemStack The ItemStack.
|
||||
* @param player The player.
|
||||
* @param args The args.
|
||||
*/
|
||||
@ApiStatus.Internal
|
||||
public static void callDisplayModule(@NotNull final DisplayModule module,
|
||||
@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
module.display(itemStack, args);
|
||||
if (player != null) {
|
||||
module.display(itemStack, player, args);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
package com.willfp.eco.core.display;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
/**
|
||||
* Interface for display implementations.
|
||||
*/
|
||||
public interface DisplayHandler {
|
||||
/**
|
||||
* Register display module.
|
||||
*
|
||||
* @param module The module.
|
||||
*/
|
||||
void registerDisplayModule(@NotNull DisplayModule module);
|
||||
|
||||
/**
|
||||
* Display on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @param player The player.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player);
|
||||
|
||||
/**
|
||||
* Revert on ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack revert(@NotNull final ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Finalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack finalize(@NotNull final ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* Unfinalize an ItemStacks.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return The ItemStack.
|
||||
*/
|
||||
ItemStack unfinalize(@NotNull final ItemStack itemStack);
|
||||
|
||||
/**
|
||||
* If an item is finalized.
|
||||
*
|
||||
* @param itemStack The item.
|
||||
* @return If finalized.
|
||||
*/
|
||||
boolean isFinalized(@NotNull final ItemStack itemStack);
|
||||
}
|
||||
@@ -36,8 +36,8 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
* @param itemStack The item.
|
||||
* @param args Optional args for display.
|
||||
*/
|
||||
protected void display(@NotNull final ItemStack itemStack,
|
||||
@NotNull final Object... args) {
|
||||
public void display(@NotNull final ItemStack itemStack,
|
||||
@NotNull final Object... args) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
@@ -48,9 +48,9 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
* @param player The player.
|
||||
* @param args Optional args for display.
|
||||
*/
|
||||
protected void display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
public void display(@NotNull final ItemStack itemStack,
|
||||
@Nullable final Player player,
|
||||
@NotNull final Object... args) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
*
|
||||
* @param itemStack The item.
|
||||
*/
|
||||
protected void revert(@NotNull final ItemStack itemStack) {
|
||||
public void revert(@NotNull final ItemStack itemStack) {
|
||||
// Technically optional.
|
||||
}
|
||||
|
||||
@@ -69,7 +69,7 @@ public abstract class DisplayModule extends PluginDependent<EcoPlugin> {
|
||||
* @param itemStack The itemStack.
|
||||
* @return The plugin-specific varargs.
|
||||
*/
|
||||
protected Object[] generateVarArgs(@NotNull final ItemStack itemStack) {
|
||||
public Object[] generateVarArgs(@NotNull final ItemStack itemStack) {
|
||||
return new Object[0];
|
||||
}
|
||||
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
package com.willfp.eco.core.integrations.shop;
|
||||
|
||||
import com.willfp.eco.core.integrations.Integration;
|
||||
|
||||
/**
|
||||
* Wrapper class for shop integrations.
|
||||
*/
|
||||
public interface ShopWrapper {
|
||||
public interface ShopWrapper extends Integration {
|
||||
/**
|
||||
* Register eco item provider for shop plugins.
|
||||
*/
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
package com.willfp.eco.core.items;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.NamespacedKey;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
@@ -47,6 +50,12 @@ public class CustomItem implements TestableItem {
|
||||
this.key = key;
|
||||
this.test = test;
|
||||
this.item = item;
|
||||
|
||||
Eco.getHandler().getEcoPlugin().getScheduler().runLater(() -> {
|
||||
if (!matches(getItem())) {
|
||||
Bukkit.getLogger().severe("Item with key " + key + " is invalid!");
|
||||
}
|
||||
}, 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -178,7 +178,10 @@ public final class Items {
|
||||
List<Predicate<ItemStack>> predicates = new ArrayList<>();
|
||||
|
||||
for (LookupArgParser argParser : ARG_PARSERS) {
|
||||
predicates.add(argParser.parseArguments(modifierArgs, meta));
|
||||
Predicate<ItemStack> predicate = argParser.parseArguments(modifierArgs, meta);
|
||||
if (predicate != null) {
|
||||
predicates.add(argParser.parseArguments(modifierArgs, meta));
|
||||
}
|
||||
}
|
||||
|
||||
example.setItemMeta(meta);
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.EnchantmentStorageMeta;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
@@ -16,8 +17,8 @@ import java.util.function.Predicate;
|
||||
*/
|
||||
public class EnchantmentArgParser implements LookupArgParser {
|
||||
@Override
|
||||
public Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
Map<Enchantment, Integer> requiredEnchantments = new HashMap<>();
|
||||
|
||||
for (String enchantArg : args) {
|
||||
@@ -37,6 +38,10 @@ public class EnchantmentArgParser implements LookupArgParser {
|
||||
requiredEnchantments.put(enchantment, level);
|
||||
}
|
||||
|
||||
if (requiredEnchantments.isEmpty()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (meta instanceof EnchantmentStorageMeta storageMeta) {
|
||||
requiredEnchantments.forEach((enchantment, integer) -> storageMeta.addStoredEnchant(enchantment, integer, true));
|
||||
} else {
|
||||
|
||||
@@ -4,6 +4,7 @@ import com.willfp.eco.core.items.TestableItem;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@@ -19,6 +20,6 @@ public interface LookupArgParser {
|
||||
* @param meta The ItemMeta to modify.
|
||||
* @return The predicate test to apply to the modified item.
|
||||
*/
|
||||
Predicate<ItemStack> parseArguments(@NotNull String[] args,
|
||||
@NotNull ItemMeta meta);
|
||||
@Nullable Predicate<ItemStack> parseArguments(@NotNull String[] args,
|
||||
@NotNull ItemMeta meta);
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import org.bukkit.inventory.ItemStack;
|
||||
import org.bukkit.inventory.meta.ItemMeta;
|
||||
import org.bukkit.inventory.meta.SkullMeta;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.function.Predicate;
|
||||
|
||||
@@ -13,8 +14,8 @@ import java.util.function.Predicate;
|
||||
*/
|
||||
public class TextureArgParser implements LookupArgParser {
|
||||
@Override
|
||||
public Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
public @Nullable Predicate<ItemStack> parseArguments(@NotNull final String[] args,
|
||||
@NotNull final ItemMeta meta) {
|
||||
String skullTexture = null;
|
||||
|
||||
for (String arg : args) {
|
||||
@@ -34,6 +35,10 @@ public class TextureArgParser implements LookupArgParser {
|
||||
SkullUtils.setSkullTexture(skullMeta, skullTexture);
|
||||
}
|
||||
|
||||
if (skullTexture == null) {
|
||||
return null;
|
||||
}
|
||||
|
||||
String finalSkullTexture = skullTexture;
|
||||
return test -> {
|
||||
if (!test.hasItemMeta()) {
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.willfp.eco.core.recipe.parts;
|
||||
|
||||
import com.willfp.eco.core.items.TestableItem;
|
||||
import lombok.Getter;
|
||||
import org.apache.commons.lang.Validate;
|
||||
import org.bukkit.inventory.ItemStack;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
@@ -82,6 +82,10 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
ShapedRecipe shapedRecipe = new ShapedRecipe(this.getKey(), this.getOutput());
|
||||
shapedRecipe.shape("012", "345", "678");
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (parts.get(i) instanceof EmptyTestableItem) {
|
||||
continue;
|
||||
}
|
||||
|
||||
char character = String.valueOf(i).toCharArray()[0];
|
||||
shapedRecipe.setIngredient(character, parts.get(i).getItem().getType());
|
||||
}
|
||||
@@ -89,6 +93,10 @@ public final class ShapedCraftingRecipe extends PluginDependent<EcoPlugin> imple
|
||||
ShapedRecipe displayedRecipe = new ShapedRecipe(this.getDisplayedKey(), this.getOutput());
|
||||
displayedRecipe.shape("012", "345", "678");
|
||||
for (int i = 0; i < 9; i++) {
|
||||
if (parts.get(i) instanceof EmptyTestableItem) {
|
||||
continue;
|
||||
}
|
||||
|
||||
char character = String.valueOf(i).toCharArray()[0];
|
||||
ItemStack item = parts.get(i).getItem();
|
||||
|
||||
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.willfp.eco.core.requirement;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* A requirement is a defined goal that a player must meet.
|
||||
*/
|
||||
public abstract class Requirement {
|
||||
/**
|
||||
* Create a new requirement.
|
||||
*/
|
||||
protected Requirement() {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Test if the player meets the requirement.
|
||||
*
|
||||
* @param player The player.
|
||||
* @param args The arguments.
|
||||
* @return The requirement.
|
||||
*/
|
||||
public abstract boolean doesPlayerMeet(@NotNull Player player,
|
||||
@NotNull List<String> args);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.core.requirement;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Interface for internal requirement factory implementations.
|
||||
*/
|
||||
public interface RequirementFactory {
|
||||
/**
|
||||
* Create a requirement.
|
||||
*
|
||||
* @param name The name.
|
||||
* @return The requirement returned for the name.
|
||||
* Will return a requirement that is always true if not found.
|
||||
*/
|
||||
Requirement create(@NotNull String name);
|
||||
}
|
||||
@@ -0,0 +1,41 @@
|
||||
package com.willfp.eco.core.requirement;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Contains methods and fields pertaining to requirements.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class Requirements {
|
||||
/**
|
||||
* Requires a player to have a permission.
|
||||
*/
|
||||
public static final Requirement HAS_PERMISSION = Eco.getHandler().getRequirementFactory().create("has-permission");
|
||||
|
||||
/**
|
||||
* Placeholder equals value.
|
||||
*/
|
||||
public static final Requirement PLACEHOLDER_EQUALS = Eco.getHandler().getRequirementFactory().create("placeholder-equals");
|
||||
|
||||
/**
|
||||
* Numeric placeholder greater than value.
|
||||
*/
|
||||
public static final Requirement PLACEHOLDER_GREATER_THAN = Eco.getHandler().getRequirementFactory().create("placeholder-greater-than");
|
||||
|
||||
/**
|
||||
* Numeric placeholder less than value.
|
||||
*/
|
||||
public static final Requirement PLACEHOLDER_LESS_THAN = Eco.getHandler().getRequirementFactory().create("placeholder-less-than");
|
||||
|
||||
/**
|
||||
* Get Requirements matching ID.
|
||||
*
|
||||
* @param name The ID to search for.
|
||||
* @return The matching Requirements.
|
||||
*/
|
||||
public static Requirement getByID(@NotNull final String name) {
|
||||
return Eco.getHandler().getRequirementFactory().create(name);
|
||||
}
|
||||
}
|
||||
@@ -38,4 +38,26 @@ public class Pair<A, B> {
|
||||
this.first = first;
|
||||
this.second = second;
|
||||
}
|
||||
|
||||
/**
|
||||
* component1 exists to allow a pair to be destructured by kotlin.
|
||||
* The default kotlin pair already has this, however there is no default
|
||||
* pair in java so this exists for parity.
|
||||
*
|
||||
* @return First.
|
||||
*/
|
||||
public A component1() {
|
||||
return first;
|
||||
}
|
||||
|
||||
/**
|
||||
* component2 exists to allow a pair to be destructured by kotlin.
|
||||
* The default kotlin pair already has this, however there is no default
|
||||
* pair in java so this exists for parity.
|
||||
*
|
||||
* @return First.
|
||||
*/
|
||||
public B component2() {
|
||||
return second;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -34,4 +34,15 @@ public class Triplet<A, B, C> extends Pair<A, B> {
|
||||
|
||||
this.third = third;
|
||||
}
|
||||
|
||||
/**
|
||||
* component3 exists to allow a pair to be destructured by kotlin.
|
||||
* The default kotlin pair already has this, however there is no default
|
||||
* pair in java so this exists for parity.
|
||||
*
|
||||
* @return First.
|
||||
*/
|
||||
public C component3() {
|
||||
return third;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,7 +31,9 @@ public class UpdateChecker extends PluginDependent<EcoPlugin> {
|
||||
public void getVersion(@NotNull final Consumer<? super String> consumer) {
|
||||
this.getPlugin().getScheduler().runAsync(() -> {
|
||||
try {
|
||||
InputStream inputStream = new URL("https://api.spigotmc.org/legacy/update.php?resource=" + this.getPlugin().getResourceId()).openStream();
|
||||
InputStream inputStream = new URL(
|
||||
"https://api.polymart.org/v1/getResourceInfoSimple?key=version&resource_id=" + this.getPlugin().getResourceId()
|
||||
).openStream();
|
||||
Scanner scanner = new Scanner(inputStream);
|
||||
|
||||
if (scanner.hasNext()) {
|
||||
|
||||
@@ -2,6 +2,7 @@ package com.willfp.eco.util;
|
||||
|
||||
import lombok.experimental.UtilityClass;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Sound;
|
||||
import org.bukkit.entity.LivingEntity;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
@@ -10,18 +11,37 @@ import org.jetbrains.annotations.NotNull;
|
||||
*/
|
||||
@UtilityClass
|
||||
public class LightningUtils {
|
||||
|
||||
/**
|
||||
* Strike lightning on player without fire.
|
||||
*
|
||||
* @param victim The entity to smite.
|
||||
* @param damage The damage to deal.
|
||||
* @param silent If the lightning sound should be played locally
|
||||
*/
|
||||
public void strike(@NotNull final LivingEntity victim,
|
||||
final double damage,
|
||||
final boolean silent) {
|
||||
Location loc = victim.getLocation();
|
||||
|
||||
if (silent) {
|
||||
victim.getWorld().spigot().strikeLightningEffect(loc, true);
|
||||
victim.getWorld().playSound(loc, Sound.ENTITY_LIGHTNING_BOLT_IMPACT, 1, 1);
|
||||
} else {
|
||||
victim.getWorld().strikeLightningEffect(loc);
|
||||
}
|
||||
|
||||
victim.damage(damage);
|
||||
}
|
||||
|
||||
/**
|
||||
* Strike lightning on a victim without fire.
|
||||
*
|
||||
* @param victim The entity to smite.
|
||||
* @param damage The damage to deal.
|
||||
*/
|
||||
public void strike(@NotNull final LivingEntity victim,
|
||||
final double damage) {
|
||||
Location loc = victim.getLocation();
|
||||
|
||||
victim.getWorld().strikeLightningEffect(loc);
|
||||
|
||||
victim.damage(damage);
|
||||
strike(victim, damage, false);
|
||||
}
|
||||
}
|
||||
|
||||
36
eco-api/src/main/java/com/willfp/eco/util/PlayerUtils.java
Normal file
36
eco-api/src/main/java/com/willfp/eco/util/PlayerUtils.java
Normal file
@@ -0,0 +1,36 @@
|
||||
package com.willfp.eco.util;
|
||||
|
||||
import com.willfp.eco.core.Eco;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.kyori.adventure.audience.Audience;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
/**
|
||||
* Utilities / API methods for players.
|
||||
*/
|
||||
@UtilityClass
|
||||
public class PlayerUtils {
|
||||
/**
|
||||
* Get the audience from a player.
|
||||
*
|
||||
* @param player The player.
|
||||
* @return The audience.
|
||||
*/
|
||||
@NotNull
|
||||
public Audience getAudience(@NotNull final Player player) {
|
||||
return Eco.getHandler().getAdventure().player(player);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the audience from a command sender.
|
||||
*
|
||||
* @param sender The command sender.
|
||||
* @return The audience.
|
||||
*/
|
||||
@NotNull
|
||||
public Audience getAudience(@NotNull final CommandSender sender) {
|
||||
return Eco.getHandler().getAdventure().sender(sender);
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,8 @@ import com.willfp.eco.core.integrations.placeholder.PlaceholderManager;
|
||||
import lombok.experimental.UtilityClass;
|
||||
import net.kyori.adventure.text.Component;
|
||||
import net.kyori.adventure.text.format.TextDecoration;
|
||||
import net.kyori.adventure.text.minimessage.MiniMessage;
|
||||
import net.kyori.adventure.text.minimessage.markdown.DiscordFlavor;
|
||||
import net.kyori.adventure.text.serializer.gson.GsonComponentSerializer;
|
||||
import net.kyori.adventure.text.serializer.legacy.LegacyComponentSerializer;
|
||||
import net.md_5.bungee.api.ChatColor;
|
||||
@@ -12,7 +14,7 @@ import org.bukkit.entity.Player;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.awt.Color;
|
||||
import java.awt.*;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collection;
|
||||
import java.util.List;
|
||||
@@ -34,6 +36,8 @@ public class StringUtils {
|
||||
.add(Pattern.compile("<GRADIENT:([0-9A-Fa-f]{6})>(.*?)</GRADIENT:([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<GRADIENT:#([0-9A-Fa-f]{6})>(.*?)</GRADIENT:#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<G:([0-9A-Fa-f]{6})>(.*?)</G:([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<G:#([0-9A-Fa-f]{6})>(.*?)</G:#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<G#([0-9A-Fa-f]{6})>(.*?)</G#([0-9A-Fa-f]{6})>", Pattern.CASE_INSENSITIVE))
|
||||
.add(Pattern.compile("<#:([0-9A-Fa-f]{6})>(.*?)</#:([0-9A-Fa-f]{6})>"))
|
||||
.add(Pattern.compile("\\{#:([0-9A-Fa-f]{6})}(.*?)\\{/#:([0-9A-Fa-f]{6})}"))
|
||||
.build();
|
||||
@@ -166,6 +170,68 @@ public class StringUtils {
|
||||
return format(message, null, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a string to a component.
|
||||
* <p>
|
||||
* Converts color codes and placeholders.
|
||||
*
|
||||
* @param message The message to translate.
|
||||
* @return The message, formatted, as a component.
|
||||
* @see StringUtils#format(String, Player)
|
||||
*/
|
||||
@NotNull
|
||||
public Component formatToComponent(@NotNull final String message) {
|
||||
return formatToComponent(message, (Player) null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a string.
|
||||
* <p>
|
||||
* Converts color codes and placeholders for a player.
|
||||
*
|
||||
* @param message The message to format.
|
||||
* @param player The player to translate placeholders with respect to.
|
||||
* @return The message, formatted.
|
||||
*/
|
||||
@NotNull
|
||||
public Component formatToComponent(@NotNull final String message,
|
||||
@Nullable final Player player) {
|
||||
return formatToComponent(message, player, FormatOption.WITH_PLACEHOLDERS);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a string to a component.
|
||||
* <p>
|
||||
* Converts color codes and placeholders if specified.
|
||||
*
|
||||
* @param message The message to translate.
|
||||
* @param option The format option.
|
||||
* @return The message, formatted, as a component.
|
||||
* @see StringUtils#format(String, Player)
|
||||
*/
|
||||
@NotNull
|
||||
public Component formatToComponent(@NotNull final String message,
|
||||
@NotNull final FormatOption option) {
|
||||
return formatToComponent(message, null, option);
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a string to a component.
|
||||
* <p>
|
||||
* Coverts color codes and placeholders for a player if specified.
|
||||
*
|
||||
* @param message The message to format.
|
||||
* @param player The player to translate placeholders with respect to.
|
||||
* @param option The format options.
|
||||
* @return The message, formatted, as a component.
|
||||
*/
|
||||
@NotNull
|
||||
public Component formatToComponent(@NotNull final String message,
|
||||
@Nullable final Player player,
|
||||
@NotNull final FormatOption option) {
|
||||
return toComponent(format(message, player, option));
|
||||
}
|
||||
|
||||
/**
|
||||
* Format a string.
|
||||
* <p>
|
||||
@@ -181,15 +247,20 @@ public class StringUtils {
|
||||
@Nullable final Player player,
|
||||
@NotNull final FormatOption option) {
|
||||
String processedMessage = message;
|
||||
processedMessage = translateGradients(processedMessage);
|
||||
if (option == FormatOption.WITH_PLACEHOLDERS) {
|
||||
processedMessage = PlaceholderManager.translatePlaceholders(processedMessage, player);
|
||||
}
|
||||
processedMessage = translateGradients(processedMessage);
|
||||
processedMessage = translateMiniMessage(processedMessage);
|
||||
processedMessage = translateHexColorCodes(processedMessage);
|
||||
processedMessage = ChatColor.translateAlternateColorCodes('&', processedMessage);
|
||||
return processedMessage;
|
||||
}
|
||||
|
||||
private static String translateMiniMessage(@NotNull final String message) {
|
||||
return LEGACY_COMPONENT_SERIALIZER.serialize(MiniMessage.withMarkdownFlavor(DiscordFlavor.get()).parse(message));
|
||||
}
|
||||
|
||||
private static String translateHexColorCodes(@NotNull final String message) {
|
||||
String processedMessage = message;
|
||||
for (Pattern pattern : HEX_PATTERNS) {
|
||||
@@ -255,6 +326,9 @@ public class StringUtils {
|
||||
@NotNull final Color end,
|
||||
final int step) {
|
||||
ChatColor[] colors = new ChatColor[step];
|
||||
if (step <= 1) {
|
||||
return colors;
|
||||
}
|
||||
int stepR = Math.abs(start.getRed() - end.getRed()) / (step - 1);
|
||||
int stepG = Math.abs(start.getGreen() - end.getGreen()) / (step - 1);
|
||||
int stepB = Math.abs(start.getBlue() - end.getBlue()) / (step - 1);
|
||||
@@ -334,10 +408,14 @@ public class StringUtils {
|
||||
* @return The JSON String.
|
||||
*/
|
||||
@NotNull
|
||||
public String legacyToJson(@NotNull final String legacy) {
|
||||
public String legacyToJson(@Nullable final String legacy) {
|
||||
String processed = legacy;
|
||||
if (legacy == null) {
|
||||
processed = "";
|
||||
}
|
||||
return GsonComponentSerializer.gson().serialize(
|
||||
Component.empty().decoration(TextDecoration.ITALIC, false).append(
|
||||
LEGACY_COMPONENT_SERIALIZER.deserialize(legacy)
|
||||
LEGACY_COMPONENT_SERIALIZER.deserialize(processed)
|
||||
)
|
||||
);
|
||||
}
|
||||
@@ -355,6 +433,33 @@ public class StringUtils {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert legacy (bukkit) text to Component.
|
||||
*
|
||||
* @param legacy The legacy text.
|
||||
* @return The component.
|
||||
*/
|
||||
@NotNull
|
||||
public Component toComponent(@Nullable final String legacy) {
|
||||
String processed = legacy;
|
||||
if (legacy == null) {
|
||||
processed = "";
|
||||
}
|
||||
|
||||
return LEGACY_COMPONENT_SERIALIZER.deserialize(processed);
|
||||
}
|
||||
|
||||
/**
|
||||
* Convert Component to legacy (bukkit) text.
|
||||
*
|
||||
* @param component The component.
|
||||
* @return The legacy text.
|
||||
*/
|
||||
@NotNull
|
||||
public String toLegacy(@NotNull final Component component) {
|
||||
return LEGACY_COMPONENT_SERIALIZER.serialize(component);
|
||||
}
|
||||
|
||||
/**
|
||||
* Options for formatting.
|
||||
*/
|
||||
|
||||
@@ -16,6 +16,6 @@ subprojects {
|
||||
|
||||
dependencies {
|
||||
compileOnly project(":eco-api")
|
||||
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.5.21'
|
||||
compileOnly 'org.jetbrains.kotlin:kotlin-stdlib:1.5.31'
|
||||
}
|
||||
}
|
||||
@@ -2,7 +2,9 @@ group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.9'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.10'
|
||||
compileOnly 'org.reflections:reflections:0.9.12'
|
||||
compileOnly 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
}
|
||||
@@ -6,6 +6,7 @@ import com.willfp.eco.core.config.interfaces.JSONConfig
|
||||
import com.willfp.eco.core.config.wrapper.ConfigFactory
|
||||
import com.willfp.eco.internal.config.json.EcoJSONConfigSection
|
||||
import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig
|
||||
import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoYamlConfigSection
|
||||
@@ -30,6 +31,24 @@ class EcoConfigFactory : ConfigFactory {
|
||||
)
|
||||
}
|
||||
|
||||
override fun createUpdatableJSONConfig(
|
||||
configName: String,
|
||||
plugin: EcoPlugin,
|
||||
subDirectoryPath: String,
|
||||
source: Class<*>,
|
||||
removeUnused: Boolean,
|
||||
vararg updateBlacklist: String
|
||||
): JSONConfig {
|
||||
return EcoUpdatableJSONConfig(
|
||||
configName,
|
||||
plugin,
|
||||
subDirectoryPath,
|
||||
source,
|
||||
removeUnused,
|
||||
*updateBlacklist
|
||||
)
|
||||
}
|
||||
|
||||
override fun createLoadableJSONConfig(
|
||||
configName: String,
|
||||
plugin: EcoPlugin,
|
||||
|
||||
@@ -6,14 +6,15 @@ import com.willfp.eco.core.config.interfaces.JSONConfig
|
||||
import com.willfp.eco.util.StringUtils
|
||||
import org.apache.commons.lang.Validate
|
||||
import java.util.*
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
open class EcoJSONConfigWrapper : JSONConfig {
|
||||
val handle: Gson = GsonBuilder().setPrettyPrinting().create()
|
||||
|
||||
val values = mutableMapOf<String, Any?>()
|
||||
val values = ConcurrentHashMap<String, Any?>()
|
||||
|
||||
private val cache = mutableMapOf<String, Any>()
|
||||
private val cache = ConcurrentHashMap<String, Any>()
|
||||
|
||||
fun init(values: Map<String, Any?>) {
|
||||
this.values.clear()
|
||||
|
||||
@@ -8,11 +8,11 @@ import java.nio.file.Files
|
||||
import java.nio.file.StandardOpenOption
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
class EcoLoadableJSONConfig(
|
||||
open class EcoLoadableJSONConfig(
|
||||
configName: String,
|
||||
private val plugin: EcoPlugin,
|
||||
private val subDirectoryPath: String,
|
||||
private val source: Class<*>
|
||||
val source: Class<*>
|
||||
) : EcoJSONConfigWrapper(), LoadableConfig {
|
||||
|
||||
private val configFile: File
|
||||
@@ -65,7 +65,7 @@ class EcoLoadableJSONConfig(
|
||||
|
||||
@Throws(FileNotFoundException::class)
|
||||
fun init(file: File) {
|
||||
super.init(handle.fromJson(FileReader(file), Map::class.java) as @NotNull MutableMap<String, Any>)
|
||||
super.init(handle.fromJson(FileReader(file), Map::class.java) as MutableMap<String, Any>)
|
||||
}
|
||||
|
||||
override fun getName(): String {
|
||||
|
||||
@@ -0,0 +1,74 @@
|
||||
package com.willfp.eco.internal.config.json
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import org.bukkit.configuration.InvalidConfigurationException
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.BufferedReader
|
||||
import java.io.IOException
|
||||
import java.io.InputStreamReader
|
||||
import java.nio.charset.StandardCharsets
|
||||
|
||||
open class EcoUpdatableJSONConfig(
|
||||
configName: String,
|
||||
plugin: EcoPlugin,
|
||||
subDirectoryPath: String,
|
||||
source: Class<*>,
|
||||
private val removeUnused: Boolean,
|
||||
vararg updateBlacklist: String
|
||||
) : EcoLoadableJSONConfig(configName, plugin, subDirectoryPath, source) {
|
||||
|
||||
private val updateBlacklist: MutableList<String> = mutableListOf(*updateBlacklist)
|
||||
|
||||
fun update() {
|
||||
super.clearCache()
|
||||
try {
|
||||
this.init(configFile)
|
||||
val newConfig = configInJar
|
||||
if (newConfig.getKeys(true) == this.getKeys(true)) {
|
||||
return
|
||||
}
|
||||
newConfig.getKeys(true).forEach { key: String ->
|
||||
if (!this.getKeys(true).contains(key)) {
|
||||
if (updateBlacklist.stream().noneMatch { s: String -> key.contains(s) }) {
|
||||
this.set(key, newConfig[key])
|
||||
}
|
||||
}
|
||||
}
|
||||
if (removeUnused) {
|
||||
this.getKeys(true).forEach { s ->
|
||||
if (!newConfig.getKeys(true).contains(s)) {
|
||||
if (updateBlacklist.stream().noneMatch(s::contains)) {
|
||||
this.set(s, null)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.save()
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: InvalidConfigurationException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
}
|
||||
|
||||
private val configInJar: YamlConfiguration
|
||||
get() {
|
||||
val newIn = this.source.getResourceAsStream(resourcePath) ?: throw NullPointerException("$name is null?")
|
||||
val reader = BufferedReader(InputStreamReader(newIn, StandardCharsets.UTF_8))
|
||||
val newConfig = YamlConfiguration()
|
||||
try {
|
||||
newConfig.load(reader)
|
||||
} catch (e: IOException) {
|
||||
e.printStackTrace()
|
||||
} catch (e: InvalidConfigurationException) {
|
||||
e.printStackTrace()
|
||||
}
|
||||
return newConfig
|
||||
}
|
||||
|
||||
init {
|
||||
this.updateBlacklist.removeIf { obj: String -> obj.isEmpty() }
|
||||
plugin.configHandler.addConfig(this)
|
||||
update()
|
||||
}
|
||||
}
|
||||
@@ -5,6 +5,7 @@ import com.willfp.eco.core.config.interfaces.LoadableConfig
|
||||
import com.willfp.eco.core.config.updating.ConfigHandler
|
||||
import com.willfp.eco.core.config.updating.ConfigUpdater
|
||||
import com.willfp.eco.internal.config.json.EcoLoadableJSONConfig
|
||||
import com.willfp.eco.internal.config.json.EcoUpdatableJSONConfig
|
||||
import com.willfp.eco.internal.config.updating.exceptions.InvalidUpdateMethodException
|
||||
import com.willfp.eco.internal.config.yaml.EcoLoadableYamlConfig
|
||||
import com.willfp.eco.internal.config.yaml.EcoUpdatableYamlConfig
|
||||
@@ -55,6 +56,7 @@ class EcoConfigHandler(
|
||||
for (config in configs) {
|
||||
when (config) {
|
||||
is EcoUpdatableYamlConfig -> config.update()
|
||||
is EcoUpdatableJSONConfig -> config.update()
|
||||
is EcoLoadableYamlConfig -> config.reloadFromFile()
|
||||
is EcoLoadableJSONConfig -> config.reloadFromFile()
|
||||
}
|
||||
|
||||
@@ -6,11 +6,12 @@ import org.apache.commons.lang.Validate
|
||||
import org.bukkit.configuration.ConfigurationSection
|
||||
import org.bukkit.configuration.file.YamlConfiguration
|
||||
import java.io.StringReader
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
|
||||
@Suppress("UNCHECKED_CAST")
|
||||
open class EcoYamlConfigWrapper<T : ConfigurationSection> : Config {
|
||||
lateinit var handle: T
|
||||
private val cache = mutableMapOf<String, Any?>()
|
||||
private val cache = ConcurrentHashMap<String, Any?>()
|
||||
|
||||
protected fun init(config: T): Config {
|
||||
handle = config
|
||||
|
||||
@@ -0,0 +1,119 @@
|
||||
package com.willfp.eco.internal.display
|
||||
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.core.display.DisplayHandler
|
||||
import com.willfp.eco.core.display.DisplayModule
|
||||
import com.willfp.eco.core.display.DisplayPriority
|
||||
import com.willfp.eco.core.fast.FastItemStack
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.entity.Player
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.persistence.PersistentDataType
|
||||
|
||||
class EcoDisplayHandler(plugin: EcoPlugin) : DisplayHandler {
|
||||
/**
|
||||
* All registered display modules.
|
||||
*/
|
||||
private val registeredModules = mutableMapOf<DisplayPriority, MutableList<DisplayModule>>()
|
||||
|
||||
/**
|
||||
* NamespacedKey for finalizing.
|
||||
*/
|
||||
private val finalizeKey: NamespacedKey = plugin.namespacedKeyFactory.create("finalized")
|
||||
|
||||
init {
|
||||
for (priority in DisplayPriority.values()) {
|
||||
registeredModules[priority] = mutableListOf()
|
||||
}
|
||||
}
|
||||
|
||||
override fun registerDisplayModule(module: DisplayModule) {
|
||||
val modules = registeredModules[module.priority] ?: return
|
||||
modules.removeIf { module1: DisplayModule ->
|
||||
module1.pluginName.equals(module.pluginName, ignoreCase = true)
|
||||
}
|
||||
modules.add(module)
|
||||
registeredModules[module.priority] = modules
|
||||
}
|
||||
|
||||
override fun display(itemStack: ItemStack, player: Player?): ItemStack {
|
||||
val pluginVarArgs = mutableMapOf<String, Array<Any>>()
|
||||
|
||||
for (priority in DisplayPriority.values()) {
|
||||
val modules = registeredModules[priority] ?: continue
|
||||
for (module in modules) {
|
||||
pluginVarArgs[module.pluginName] = module.generateVarArgs(itemStack)
|
||||
}
|
||||
}
|
||||
|
||||
Display.revert(itemStack)
|
||||
|
||||
itemStack.itemMeta ?: return itemStack
|
||||
|
||||
for (priority in DisplayPriority.values()) {
|
||||
val modules = registeredModules[priority] ?: continue
|
||||
for (module in modules) {
|
||||
val varargs = pluginVarArgs[module.pluginName] ?: continue
|
||||
Display.callDisplayModule(module, itemStack, player, *varargs)
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack
|
||||
}
|
||||
|
||||
override fun revert(itemStack: ItemStack): ItemStack {
|
||||
if (Display.isFinalized(itemStack)) {
|
||||
Display.unfinalize(itemStack)
|
||||
}
|
||||
|
||||
val fast = FastItemStack.wrap(itemStack)
|
||||
val lore = fast.lore
|
||||
|
||||
if (lore.isNotEmpty() && lore.removeIf { line: String ->
|
||||
line.startsWith(
|
||||
Display.PREFIX
|
||||
)
|
||||
}) { // Only modify lore if needed.
|
||||
fast.lore = lore
|
||||
}
|
||||
|
||||
for (priority in DisplayPriority.values()) {
|
||||
val modules = registeredModules[priority] ?: continue
|
||||
for (module in modules) {
|
||||
module.revert(itemStack)
|
||||
}
|
||||
}
|
||||
|
||||
return itemStack
|
||||
}
|
||||
|
||||
override fun finalize(itemStack: ItemStack): ItemStack {
|
||||
if (itemStack.type.maxStackSize > 1) {
|
||||
return itemStack
|
||||
}
|
||||
|
||||
val meta = itemStack.itemMeta ?: return itemStack
|
||||
|
||||
val container = meta.persistentDataContainer
|
||||
container.set(finalizeKey, PersistentDataType.INTEGER, 1)
|
||||
itemStack.itemMeta = meta
|
||||
return itemStack
|
||||
}
|
||||
|
||||
override fun unfinalize(itemStack: ItemStack): ItemStack {
|
||||
val meta = itemStack.itemMeta ?: return itemStack
|
||||
|
||||
val container = meta.persistentDataContainer
|
||||
container.remove(finalizeKey)
|
||||
itemStack.itemMeta = meta
|
||||
return itemStack
|
||||
}
|
||||
|
||||
override fun isFinalized(itemStack: ItemStack): Boolean {
|
||||
val meta = itemStack.itemMeta ?: return false
|
||||
|
||||
val container = meta.persistentDataContainer
|
||||
return container.has(finalizeKey, PersistentDataType.INTEGER)
|
||||
}
|
||||
}
|
||||
@@ -22,11 +22,11 @@ class EcoMenu(
|
||||
): Menu {
|
||||
override fun getSlot(row: Int, column: Int): Slot {
|
||||
if (row < 1 || row > this.rows) {
|
||||
throw IllegalArgumentException("Invalid row number!")
|
||||
return slots[0][0]
|
||||
}
|
||||
|
||||
if (column < 1 || column > 9) {
|
||||
throw IllegalArgumentException("Invalid column number!")
|
||||
return slots[0][0]
|
||||
}
|
||||
|
||||
return slots[row - 1][column - 1]
|
||||
|
||||
@@ -18,9 +18,7 @@ class ExtendedInventory(
|
||||
fun refresh(player: Player) {
|
||||
captiveItems.clear()
|
||||
for (i in 0 until inventory.size) {
|
||||
val pair = MenuUtils.convertSlotToRowColumn(i)
|
||||
val row = pair.first!!
|
||||
val column = pair.second!!
|
||||
val (row, column) = MenuUtils.convertSlotToRowColumn(i)
|
||||
val slot = menu.getSlot(row, column)
|
||||
if (slot is EcoCaptivatorSlot) {
|
||||
val defaultItem = slot.getItemStack(player)
|
||||
|
||||
@@ -2,10 +2,11 @@ package com.willfp.eco.internal.gui.menu
|
||||
|
||||
import com.willfp.eco.core.gui.menu.Menu
|
||||
import org.bukkit.inventory.Inventory
|
||||
import java.util.*
|
||||
|
||||
object MenuHandler {
|
||||
private val menus = mutableMapOf<ExtendedInventory, EcoMenu>()
|
||||
private val inventories = mutableMapOf<Inventory, ExtendedInventory>()
|
||||
private val menus = WeakHashMap<ExtendedInventory, EcoMenu>()
|
||||
private val inventories = WeakHashMap<Inventory, ExtendedInventory>()
|
||||
|
||||
fun registerMenu(
|
||||
inventory: Inventory,
|
||||
|
||||
@@ -0,0 +1,17 @@
|
||||
package com.willfp.eco.internal.requirement
|
||||
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import com.willfp.eco.core.requirement.RequirementFactory
|
||||
import com.willfp.eco.internal.requirement.requirements.*
|
||||
|
||||
class EcoRequirementFactory: RequirementFactory {
|
||||
override fun create(name: String): Requirement {
|
||||
return when (name.lowercase()) {
|
||||
"has-permission" -> RequirementHasPermission()
|
||||
"placeholder-equals" -> RequirementPlaceholderEquals()
|
||||
"placeholder-greater-than" -> RequirementPlaceholderGreaterThan()
|
||||
"placeholder-less-than" -> RequirementPlaceholderLessThan()
|
||||
else -> RequirementTrue()
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementHasPermission : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.isEmpty()) {
|
||||
return false
|
||||
}
|
||||
|
||||
val permission = args[0]
|
||||
return player.hasPermission(permission)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderEquals : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1]
|
||||
return PlaceholderManager.translatePlaceholders(placeholder, player).equals(equals, ignoreCase = true)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderGreaterThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0 >= equals
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderManager
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementPlaceholderLessThan : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
if (args.size < 2) {
|
||||
return false
|
||||
}
|
||||
|
||||
val placeholder = args[0]
|
||||
val equals = args[1].toDoubleOrNull() ?: return false
|
||||
return PlaceholderManager.translatePlaceholders(placeholder, player).toDoubleOrNull() ?: 0.0 < equals
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
package com.willfp.eco.internal.requirement.requirements
|
||||
|
||||
import com.willfp.eco.core.requirement.Requirement
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class RequirementTrue : Requirement() {
|
||||
override fun doesPlayerMeet(
|
||||
player: Player,
|
||||
args: List<String>
|
||||
): Boolean {
|
||||
return true
|
||||
}
|
||||
}
|
||||
@@ -3,26 +3,28 @@ version rootProject.version
|
||||
|
||||
dependencies {
|
||||
implementation 'org.bstats:bstats-bukkit:1.7'
|
||||
implementation 'net.kyori:adventure-text-minimessage:4.1.0-SNAPSHOT'
|
||||
compileOnly 'org.apache.maven:maven-artifact:3.0.3'
|
||||
compileOnly 'com.google.code.gson:gson:2.8.7'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
compileOnly project(":eco-core:core-proxy")
|
||||
compileOnly project(":eco-core:core-backend")
|
||||
compileOnly 'com.comphenix.protocol:ProtocolLib:4.6.0-SNAPSHOT'
|
||||
compileOnly 'com.sk89q.worldguard:worldguard-bukkit:7.0.4-SNAPSHOT'
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.14.0'
|
||||
compileOnly 'com.github.TechFortress:GriefPrevention:16.17.1'
|
||||
compileOnly 'com.massivecraft:Factions:1.6.9.5-U0.5.10'
|
||||
compileOnly 'com.github.cryptomorin:kingdoms:1.10.14'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.96.2.0'
|
||||
compileOnly 'com.github.TownyAdvanced:Towny:0.97.1.0'
|
||||
compileOnly 'com.github.angeschossen:LandsAPI:4.7.3'
|
||||
compileOnly 'fr.neatmonster:nocheatplus:3.16.1-SNAPSHOT'
|
||||
compileOnly 'com.github.jiangdashao:matrix-api-repo:317d4635fd'
|
||||
compileOnly 'com.gmail.nossr50.mcMMO:mcMMO:2.1.157'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.9'
|
||||
compileOnly 'me.clip:placeholderapi:2.10.10'
|
||||
compileOnly 'com.willfp:Oraxen:e1f4003d8d'
|
||||
compileOnly 'com.github.brcdev-minecraft:shopgui-api:2.2.0'
|
||||
compileOnly 'com.github.LoneDev6:API-ItemsAdder:2.4.7'
|
||||
compileOnly 'me.arcaniax:HeadDatabase-API:1.2.0'
|
||||
compileOnly 'net.kyori:adventure-platform-bukkit:4.0.0'
|
||||
|
||||
// CombatLogX V10 + NewbieHelper Expansion
|
||||
compileOnly 'com.SirBlobman.combatlogx:CombatLogX-API:10.0.0.0-SNAPSHOT'
|
||||
|
||||
@@ -15,6 +15,7 @@ import com.willfp.eco.core.gui.GUIFactory
|
||||
import com.willfp.eco.core.integrations.placeholder.PlaceholderIntegration
|
||||
import com.willfp.eco.core.proxy.Cleaner
|
||||
import com.willfp.eco.core.proxy.ProxyFactory
|
||||
import com.willfp.eco.core.requirement.RequirementFactory
|
||||
import com.willfp.eco.core.scheduling.Scheduler
|
||||
import com.willfp.eco.internal.EcoCleaner
|
||||
import com.willfp.eco.internal.Plugins
|
||||
@@ -30,15 +31,19 @@ import com.willfp.eco.internal.gui.EcoGUIFactory
|
||||
import com.willfp.eco.internal.integrations.PlaceholderIntegrationPAPI
|
||||
import com.willfp.eco.internal.logging.EcoLogger
|
||||
import com.willfp.eco.internal.proxy.EcoProxyFactory
|
||||
import com.willfp.eco.internal.requirement.EcoRequirementFactory
|
||||
import com.willfp.eco.internal.scheduling.EcoScheduler
|
||||
import com.willfp.eco.proxy.FastItemStackFactoryProxy
|
||||
import com.willfp.eco.spigot.integrations.bstats.MetricHandler
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.util.logging.Logger
|
||||
|
||||
@Suppress("UNUSED")
|
||||
class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
private val cleaner = EcoCleaner()
|
||||
private val requirementFactory = EcoRequirementFactory()
|
||||
private lateinit var adventure: BukkitAudiences
|
||||
|
||||
override fun createScheduler(plugin: EcoPlugin): Scheduler {
|
||||
return EcoScheduler(plugin)
|
||||
@@ -119,4 +124,16 @@ class EcoHandler : EcoSpigotPlugin(), Handler {
|
||||
override fun registerBStats(plugin: EcoPlugin) {
|
||||
MetricHandler.createMetrics(plugin, this.ecoPlugin)
|
||||
}
|
||||
|
||||
override fun getRequirementFactory(): RequirementFactory {
|
||||
return requirementFactory
|
||||
}
|
||||
|
||||
override fun getAdventure(): BukkitAudiences {
|
||||
return adventure
|
||||
}
|
||||
|
||||
fun setAdventure(adventure: BukkitAudiences) {
|
||||
this.adventure = adventure
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.willfp.eco.spigot
|
||||
|
||||
import com.willfp.eco.core.AbstractPacketAdapter
|
||||
import com.willfp.eco.core.Eco
|
||||
import com.willfp.eco.core.EcoPlugin
|
||||
import com.willfp.eco.core.display.Display
|
||||
import com.willfp.eco.core.integrations.IntegrationLoader
|
||||
@@ -12,6 +13,7 @@ import com.willfp.eco.core.integrations.shop.ShopManager
|
||||
import com.willfp.eco.core.items.Items
|
||||
import com.willfp.eco.core.items.args.EnchantmentArgParser
|
||||
import com.willfp.eco.core.items.args.TextureArgParser
|
||||
import com.willfp.eco.internal.display.EcoDisplayHandler
|
||||
import com.willfp.eco.internal.drops.DropManager
|
||||
import com.willfp.eco.proxy.BlockBreakProxy
|
||||
import com.willfp.eco.proxy.FastItemStackFactoryProxy
|
||||
@@ -23,7 +25,6 @@ import com.willfp.eco.spigot.eventlisteners.*
|
||||
import com.willfp.eco.spigot.gui.GUIListener
|
||||
import com.willfp.eco.spigot.integrations.anticheat.*
|
||||
import com.willfp.eco.spigot.integrations.antigrief.*
|
||||
import com.willfp.eco.spigot.integrations.customitems.CustomItemsHeadDatabase
|
||||
import com.willfp.eco.spigot.integrations.customitems.CustomItemsItemsAdder
|
||||
import com.willfp.eco.spigot.integrations.customitems.CustomItemsOraxen
|
||||
import com.willfp.eco.spigot.integrations.mcmmo.McmmoIntegrationImpl
|
||||
@@ -31,6 +32,7 @@ import com.willfp.eco.spigot.integrations.shop.ShopShopGuiPlus
|
||||
import com.willfp.eco.spigot.recipes.ShapedRecipeListener
|
||||
import com.willfp.eco.util.BlockUtils
|
||||
import com.willfp.eco.util.SkullUtils
|
||||
import net.kyori.adventure.platform.bukkit.BukkitAudiences
|
||||
import org.bukkit.Bukkit
|
||||
import org.bukkit.Material
|
||||
import org.bukkit.block.Block
|
||||
@@ -40,14 +42,12 @@ import org.bukkit.inventory.ItemStack
|
||||
import org.bukkit.inventory.meta.SkullMeta
|
||||
|
||||
abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
87955,
|
||||
773,
|
||||
10043,
|
||||
"com.willfp.eco.proxy",
|
||||
"&a"
|
||||
) {
|
||||
init {
|
||||
Display.setFinalizeKey(namespacedKeyFactory.create("finalized"))
|
||||
|
||||
Items.registerArgParser(EnchantmentArgParser())
|
||||
Items.registerArgParser(TextureArgParser())
|
||||
|
||||
@@ -59,10 +59,17 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
|
||||
val blockBreakProxy = getProxy(BlockBreakProxy::class.java)
|
||||
BlockUtils.initialize { player: Player, block: Block -> blockBreakProxy.breakBlock(player, block) }
|
||||
|
||||
postInit()
|
||||
}
|
||||
|
||||
private fun postInit() {
|
||||
Display.handler = EcoDisplayHandler(this)
|
||||
}
|
||||
|
||||
override fun handleEnable() {
|
||||
CollatedRunnable(this)
|
||||
(Eco.getHandler() as EcoHandler).adventure = BukkitAudiences.create(this)
|
||||
|
||||
this.logger.info("Ignore messages about deprecated events!")
|
||||
|
||||
@@ -83,6 +90,10 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
this.getProxy(FastItemStackFactoryProxy::class.java).create(ItemStack(Material.AIR)).unwrap()
|
||||
}
|
||||
|
||||
override fun handleDisable() {
|
||||
Eco.getHandler().adventure.close()
|
||||
}
|
||||
|
||||
override fun handleReload() {
|
||||
CollatedRunnable(this)
|
||||
DropManager.update(this)
|
||||
@@ -90,6 +101,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
|
||||
override fun handleAfterLoad() {
|
||||
CustomItemsManager.registerAllItems()
|
||||
ShopManager.registerEcoProvider()
|
||||
}
|
||||
|
||||
override fun loadIntegrationLoaders(): List<IntegrationLoader> {
|
||||
@@ -97,6 +109,7 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
// AntiGrief
|
||||
IntegrationLoader("WorldGuard") { AntigriefManager.register(AntigriefWorldGuard()) },
|
||||
IntegrationLoader("GriefPrevention") { AntigriefManager.register(AntigriefGriefPrevention()) },
|
||||
IntegrationLoader("GriefDefender") { AntigriefManager.register(AntigriefGriefDefender()) },
|
||||
IntegrationLoader("FactionsUUID") { AntigriefManager.register(AntigriefFactionsUUID()) },
|
||||
IntegrationLoader("Towny") { AntigriefManager.register(AntigriefTowny()) },
|
||||
IntegrationLoader("Lands") { AntigriefManager.register(AntigriefLands(this)) },
|
||||
@@ -123,10 +136,9 @@ abstract class EcoSpigotPlugin : EcoPlugin(
|
||||
// Custom Items
|
||||
IntegrationLoader("Oraxen") { CustomItemsManager.register(CustomItemsOraxen()) },
|
||||
IntegrationLoader("ItemsAdder") { CustomItemsManager.register(CustomItemsItemsAdder(this)) },
|
||||
IntegrationLoader("HeadDatabase") { CustomItemsManager.register(CustomItemsHeadDatabase()) },
|
||||
|
||||
// Shop
|
||||
IntegrationLoader("ShopGuiPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
||||
IntegrationLoader("ShopGUIPlus") { ShopManager.register(ShopShopGuiPlus()) },
|
||||
|
||||
// Misc
|
||||
IntegrationLoader("mcMMO") { McmmoManager.register(McmmoIntegrationImpl()) }
|
||||
|
||||
@@ -11,7 +11,10 @@ import com.willfp.eco.proxy.ChatComponentProxy
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class PacketChat(plugin: EcoPlugin) :
|
||||
AbstractPacketAdapter(plugin, PacketType.Play.Server.CHAT, ListenerPriority.MONITOR, true) {
|
||||
AbstractPacketAdapter(plugin,
|
||||
PacketType.Play.Server.CHAT,
|
||||
if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.MONITOR,
|
||||
true) {
|
||||
override fun onSend(
|
||||
packet: PacketContainer,
|
||||
player: Player,
|
||||
|
||||
@@ -13,7 +13,10 @@ import org.bukkit.inventory.ItemFlag
|
||||
import org.bukkit.inventory.MerchantRecipe
|
||||
|
||||
class PacketOpenWindowMerchant(plugin: EcoPlugin) :
|
||||
AbstractPacketAdapter(plugin, PacketType.Play.Server.OPEN_WINDOW_MERCHANT, ListenerPriority.MONITOR, true) {
|
||||
AbstractPacketAdapter(plugin,
|
||||
PacketType.Play.Server.OPEN_WINDOW_MERCHANT,
|
||||
if (plugin.configYml.getBool("use-lower-protocollib-priority")) ListenerPriority.NORMAL else ListenerPriority.MONITOR,
|
||||
true) {
|
||||
override fun onSend(
|
||||
packet: PacketContainer,
|
||||
player: Player,
|
||||
|
||||
@@ -23,9 +23,7 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
|
||||
return
|
||||
}
|
||||
val menu = MenuHandler.getMenu(event.clickedInventory ?: return) ?: return
|
||||
val rowColumn = MenuUtils.convertSlotToRowColumn(event.slot)
|
||||
val row = rowColumn.first!!
|
||||
val column = rowColumn.second!!
|
||||
val (row, column) = MenuUtils.convertSlotToRowColumn(event.slot)
|
||||
val slot = menu.getSlot(row, column)
|
||||
Validate.isTrue(slot is EcoSlot, "Slot not instance of EcoSlot!")
|
||||
val ecoSlot = menu.getSlot(row, column) as EcoSlot
|
||||
@@ -73,9 +71,7 @@ class GUIListener(private val plugin: EcoPlugin) : Listener {
|
||||
|
||||
val menu = MenuHandler.getMenu(inv) ?: return
|
||||
|
||||
val rowColumn = MenuUtils.convertSlotToRowColumn(inv.firstEmpty())
|
||||
val row = rowColumn.first!!
|
||||
val column = rowColumn.second!!
|
||||
val (row, column) = MenuUtils.convertSlotToRowColumn(inv.firstEmpty())
|
||||
val slot = menu.getSlot(row, column)
|
||||
|
||||
if (!slot.isCaptive) {
|
||||
|
||||
@@ -0,0 +1,81 @@
|
||||
package com.willfp.eco.spigot.integrations.antigrief
|
||||
|
||||
import com.flowpowered.math.vector.Vector3i
|
||||
import com.griefdefender.api.GriefDefender
|
||||
import com.griefdefender.api.data.PlayerData
|
||||
import com.griefdefender.api.permission.flag.Flags
|
||||
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.entity.Player
|
||||
import java.util.*
|
||||
|
||||
class AntigriefGriefDefender : AntigriefWrapper {
|
||||
override fun canBreakBlock(player: Player, block: Block): Boolean {
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim = GriefDefender.getCore().getClaimAt(Vector3i(block.location.x, block.location.y, block.location.z))
|
||||
?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.BLOCK_BREAK, data.user, Collections.emptySet(), true).asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canCreateExplosion(player: Player, location: Location): Boolean {
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim = GriefDefender.getCore().getClaimAt(Vector3i(location.x, location.y, location.z)) ?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.EXPLOSION_BLOCK, data.user, Collections.emptySet(), true)
|
||||
.asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canPlaceBlock(player: Player, block: Block): Boolean {
|
||||
|
||||
val data: PlayerData = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
val claim =
|
||||
GriefDefender.getCore().getClaimAt(Vector3i(block.location.x, block.location.y, block.location.z))
|
||||
?: return true
|
||||
|
||||
return if (data.canIgnoreClaim(claim)) {
|
||||
true
|
||||
} else {
|
||||
claim.getActiveFlagPermissionValue(Flags.BLOCK_PLACE, data.user, Collections.emptySet(), true)
|
||||
.asBoolean()
|
||||
}
|
||||
}
|
||||
|
||||
override fun canInjure(player: Player, victim: LivingEntity): Boolean {
|
||||
|
||||
val data = GriefDefender.getCore().getPlayerData(player.world.uid, player.uniqueId) ?: return true
|
||||
|
||||
if (data.canIgnoreClaim(data.currentClaim)) {
|
||||
return true
|
||||
}
|
||||
|
||||
return if (victim is Player) {
|
||||
val vicData = GriefDefender.getCore().getPlayerData(victim.world.uid, victim.uniqueId)
|
||||
if (vicData != null) {
|
||||
data.canPvp(data.currentClaim) && data.canPvp(vicData.currentClaim)
|
||||
} else data.canPvp(data.currentClaim)
|
||||
} else {
|
||||
val claim =
|
||||
GriefDefender.getCore().getClaimAt(Vector3i(victim.location.x, victim.location.y, victim.location.z))
|
||||
claim?.getActiveFlagPermissionValue(Flags.ENTITY_DAMAGE, data.user, Collections.emptySet(), true)
|
||||
?.asBoolean() ?: true
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "GriefDefender"
|
||||
}
|
||||
}
|
||||
@@ -2,9 +2,7 @@ package com.willfp.eco.spigot.integrations.antigrief
|
||||
|
||||
import com.palmergames.bukkit.towny.TownyAPI
|
||||
import com.palmergames.bukkit.towny.TownyUniverse
|
||||
import com.palmergames.bukkit.towny.`object`.Town
|
||||
import com.palmergames.bukkit.towny.`object`.TownyPermission
|
||||
import com.palmergames.bukkit.towny.`object`.WorldCoord
|
||||
import com.palmergames.bukkit.towny.utils.PlayerCacheUtil
|
||||
import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
|
||||
import org.bukkit.Location
|
||||
@@ -67,22 +65,8 @@ class AntigriefTowny : AntigriefWrapper {
|
||||
true
|
||||
}
|
||||
}
|
||||
if (victim is Player) {
|
||||
try {
|
||||
val town: Town = WorldCoord.parseWorldCoord(victim.getLocation()).townBlock.town
|
||||
return town.isPVP
|
||||
} catch (ignored: Exception) {
|
||||
// If exception, no town was found, thus return true.
|
||||
}
|
||||
} else {
|
||||
try {
|
||||
val town: Town = WorldCoord.parseWorldCoord(victim.location).townBlock.town
|
||||
return town.hasMobs()
|
||||
} catch (ignored: Exception) {
|
||||
// If exception, no town was found, thus return true.
|
||||
}
|
||||
}
|
||||
return true
|
||||
val townBlock = TownyAPI.getInstance().getTownBlock(victim.location) ?: return true
|
||||
return townBlock.permissions.pvp
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
|
||||
@@ -11,7 +11,9 @@ import com.willfp.eco.core.integrations.antigrief.AntigriefWrapper
|
||||
import org.apache.commons.lang.Validate
|
||||
import org.bukkit.Location
|
||||
import org.bukkit.block.Block
|
||||
import org.bukkit.entity.Animals
|
||||
import org.bukkit.entity.LivingEntity
|
||||
import org.bukkit.entity.Monster
|
||||
import org.bukkit.entity.Player
|
||||
|
||||
class AntigriefWorldGuard : AntigriefWrapper {
|
||||
@@ -79,22 +81,21 @@ class AntigriefWorldGuard : AntigriefWrapper {
|
||||
val localPlayer: LocalPlayer = WorldGuardPlugin.inst().wrapPlayer(player)
|
||||
val container: RegionContainer = WorldGuard.getInstance().platform.regionContainer
|
||||
val query: RegionQuery = container.createQuery()
|
||||
if (victim is Player) {
|
||||
if (!query.testBuild(BukkitAdapter.adapt(victim.getLocation()), localPlayer, Flags.PVP)) {
|
||||
return WorldGuard.getInstance().platform.sessionManager.hasBypass(
|
||||
localPlayer,
|
||||
BukkitAdapter.adapt(player.world)
|
||||
)
|
||||
}
|
||||
} else {
|
||||
if (!query.testBuild(BukkitAdapter.adapt(victim.location), localPlayer, Flags.DAMAGE_ANIMALS)) {
|
||||
return WorldGuard.getInstance().platform.sessionManager.hasBypass(
|
||||
localPlayer,
|
||||
BukkitAdapter.adapt(player.world)
|
||||
)
|
||||
}
|
||||
val flag = when(victim) {
|
||||
is Player -> Flags.PVP
|
||||
is Monster -> Flags.MOB_DAMAGE
|
||||
is Animals -> Flags.DAMAGE_ANIMALS
|
||||
else -> return true
|
||||
}
|
||||
|
||||
return if (!query.testBuild(BukkitAdapter.adapt(victim.location), localPlayer, flag)) {
|
||||
WorldGuard.getInstance().platform.sessionManager.hasBypass(
|
||||
localPlayer,
|
||||
BukkitAdapter.adapt(player.world)
|
||||
)
|
||||
} else {
|
||||
true
|
||||
}
|
||||
return true
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
package com.willfp.eco.spigot.integrations.customitems
|
||||
|
||||
import com.willfp.eco.core.integrations.customitems.CustomItemsWrapper
|
||||
import com.willfp.eco.core.items.CustomItem
|
||||
import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import me.arcaniax.hdb.api.HeadDatabaseAPI
|
||||
import me.arcaniax.hdb.enums.CategoryEnum
|
||||
import java.util.function.Predicate
|
||||
|
||||
class CustomItemsHeadDatabase : CustomItemsWrapper {
|
||||
private val api = HeadDatabaseAPI()
|
||||
|
||||
override fun registerAllItems() {
|
||||
for (categoryEnum in CategoryEnum.values()) {
|
||||
for (head in api.getHeads(categoryEnum).toList()) {
|
||||
val stack = head.head
|
||||
val id = head.id
|
||||
val key = NamespacedKeyUtils.create("headdb", id.lowercase());
|
||||
CustomItem(
|
||||
key,
|
||||
Predicate { test ->
|
||||
val headId = api.getItemID(test) ?: return@Predicate false
|
||||
headId.equals(id, ignoreCase = true)
|
||||
},
|
||||
stack
|
||||
).register()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "HeadDatabase"
|
||||
}
|
||||
}
|
||||
@@ -6,13 +6,15 @@ import com.willfp.eco.util.NamespacedKeyUtils
|
||||
import io.th0rgal.oraxen.items.OraxenItems
|
||||
import org.bukkit.NamespacedKey
|
||||
import org.bukkit.inventory.ItemStack
|
||||
import java.util.*
|
||||
import java.util.function.Predicate
|
||||
|
||||
class CustomItemsOraxen : CustomItemsWrapper {
|
||||
override fun registerAllItems() {
|
||||
for (item in OraxenItems.getItems()) {
|
||||
val stack = item.build()
|
||||
val id: String = OraxenItems.getIdByItem(item)
|
||||
val id: String = Objects.requireNonNullElse(OraxenItems.getIdByItem(item), "")
|
||||
if (id.isEmpty()) continue
|
||||
val key: NamespacedKey = NamespacedKeyUtils.create("oraxen", id.lowercase())
|
||||
CustomItem(
|
||||
key, Predicate { test: ItemStack ->
|
||||
|
||||
@@ -28,4 +28,8 @@ class ShopShopGuiPlus : ShopWrapper {
|
||||
return Items.getCustomItem(itemStack1)?.key == Items.getCustomItem(itemStack2)?.key
|
||||
}
|
||||
}
|
||||
|
||||
override fun getPluginName(): String {
|
||||
return "ShopGUIPlus"
|
||||
}
|
||||
}
|
||||
@@ -14,4 +14,9 @@ use-fast-collated-drops: true
|
||||
|
||||
# bStats is important and you should keep it enabled.
|
||||
# This option is only here because of compliance with data protection laws.
|
||||
enable-bstats: true
|
||||
enable-bstats: true
|
||||
|
||||
# Some plugins use their own item display systems (eg Triton)
|
||||
# And must be ran after eco. Don't enable this unless you run a conflicting plugin
|
||||
# and have been told to enable it.
|
||||
use-lower-protocollib-priority: false
|
||||
@@ -21,13 +21,15 @@ softdepend:
|
||||
- PlaceholderAPI
|
||||
- mcMMO
|
||||
- CombatLogX
|
||||
- ShopGuiPlus
|
||||
- ShopGUIPlus
|
||||
- ItemsAdder
|
||||
- Oraxen
|
||||
- HeadDatabase
|
||||
- GriefDefender
|
||||
libraries:
|
||||
- org.reflections:reflections:0.9.12
|
||||
- org.apache.maven:maven-artifact:3.0.3
|
||||
- net.kyori:adventure-text-serializer-gson:4.8.1
|
||||
- net.kyori:adventure-text-serializer-legacy:4.8.1
|
||||
- org.jetbrains.kotlin:kotlin-stdlib:1.5.21
|
||||
- org.jetbrains.kotlin:kotlin-stdlib:1.5.31
|
||||
- net.kyori:adventure-platform-bukkit:4.0.0
|
||||
@@ -2,5 +2,5 @@ group 'com.willfp'
|
||||
version rootProject.version
|
||||
|
||||
dependencies {
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17-R0.1-SNAPSHOT'
|
||||
compileOnly 'org.spigotmc:spigot-api:1.17.1-R0.1-SNAPSHOT'
|
||||
}
|
||||
@@ -1,2 +1,2 @@
|
||||
version = 6.7.1
|
||||
version = 6.9.0
|
||||
plugin-name = eco
|
||||
BIN
lib/griefdefenderapi-2.0.0-SNAPSHOT.jar
Normal file
BIN
lib/griefdefenderapi-2.0.0-SNAPSHOT.jar
Normal file
Binary file not shown.
Reference in New Issue
Block a user