diff --git a/Plugin/pom.xml b/Plugin/pom.xml
index 1e89fd06..590ae3ad 100644
--- a/Plugin/pom.xml
+++ b/Plugin/pom.xml
@@ -249,5 +249,11 @@
1.7
compile
+
+ com.destroystokyo.paper
+ paper-api
+ 1.16.3-R0.1-SNAPSHOT
+ provided
+
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java
index ff93bb9a..16f8a02a 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/AbstractCommand.java
@@ -23,9 +23,8 @@ public abstract class AbstractCommand implements CommandExecutor, Registerable {
this.playersOnly = playersOnly;
}
- public AbstractCommand setTab(AbstractTabCompleter tabCompleter) {
- this.tabCompleter = tabCompleter;
- return this;
+ public AbstractTabCompleter getTab() {
+ return null;
}
public String getPermission() {
@@ -58,6 +57,8 @@ public abstract class AbstractCommand implements CommandExecutor, Registerable {
@Override
public final void register() {
Bukkit.getPluginCommand(name).setExecutor(this);
+
+ this.tabCompleter = this.getTab();
if(tabCompleter != null) {
Bukkit.getPluginCommand(name).setTabCompleter(tabCompleter);
}
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java b/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java
index cad5436b..32031f2e 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/command/commands/CommandEnchantinfo.java
@@ -1,6 +1,8 @@
package com.willfp.ecoenchants.command.commands;
import com.willfp.ecoenchants.command.AbstractCommand;
+import com.willfp.ecoenchants.command.AbstractTabCompleter;
+import com.willfp.ecoenchants.command.tabcompleters.TabCompleterEnchantinfo;
import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.enchantments.EcoEnchant;
import com.willfp.ecoenchants.enchantments.EcoEnchants;
@@ -20,6 +22,11 @@ public final class CommandEnchantinfo extends AbstractCommand {
super("enchantinfo", "ecoenchants.enchantinfo", false);
}
+ @Override
+ public AbstractTabCompleter getTab() {
+ return new TabCompleterEnchantinfo();
+ }
+
@Override
public void onExecute(CommandSender sender, List args) {
if(args.size() == 0) {
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java
index 43d9ad40..36fb5433 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchant.java
@@ -4,7 +4,9 @@ import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.config.configs.EnchantmentConfig;
import com.willfp.ecoenchants.enchantments.meta.EnchantmentRarity;
import com.willfp.ecoenchants.enchantments.util.Watcher;
+import com.willfp.ecoenchants.util.Logger;
import com.willfp.ecoenchants.util.interfaces.Registerable;
+import com.willfp.ecoenchants.util.optional.Prerequisite;
import net.md_5.bungee.api.ChatColor;
import org.apache.commons.lang.WordUtils;
import org.bukkit.Material;
@@ -39,11 +41,11 @@ public abstract class EcoEnchant extends Enchantment implements Listener, Regist
private boolean enabled;
/**
- * Create new EcoEnchant matching builder
+ * Create new EcoEnchant matching builder and prerequisites
*
* @param builder The {@link EcoEnchantBuilder} for enchantment
*/
- protected EcoEnchant(EcoEnchantBuilder builder) {
+ protected EcoEnchant(EcoEnchantBuilder builder, Prerequisite[] prerequisites) {
super(NamespacedKey.minecraft(builder.key));
this.type = builder.type;
@@ -51,10 +53,28 @@ public abstract class EcoEnchant extends Enchantment implements Listener, Regist
this.configVersion = builder.configVersion;
this.config = builder.config;
+ if(!Arrays.stream(prerequisites).allMatch(Prerequisite::isMet)) {
+ Arrays.stream(prerequisites).forEach(prerequisite -> {
+ if(!prerequisite.isMet()) {
+ Logger.warn("Enchantment " + builder.key + " does not match prerequisite \"" + prerequisite.name() + "\". It will not be available.");
+ }
+ });
+ return;
+ }
+
this.update();
this.add();
}
+ /**
+ * Create new EcoEnchant matching builder
+ *
+ * @param builder The {@link EcoEnchantBuilder} for enchantment
+ */
+ protected EcoEnchant(EcoEnchantBuilder builder) {
+ this(builder, new Prerequisite[]{});
+ }
+
/**
* Update the enchantment based off config values
*/
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java
index 56e28b63..91d54121 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/EcoEnchants.java
@@ -227,6 +227,7 @@ public class EcoEnchants {
public static final EcoEnchant INACCURACY_CURSE = new InaccuracyCurse();
public static final EcoEnchant RESPIRATOR = new Respirator();
public static final EcoEnchant FETCHING = new Fetching();
+ public static final EcoEnchant ECONOMICAL = new Economical();
/**
* Get all registered {@link EcoEnchant}s
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Economical.java b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Economical.java
new file mode 100644
index 00000000..367ccbfb
--- /dev/null
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/enchantments/ecoenchants/normal/Economical.java
@@ -0,0 +1,24 @@
+package com.willfp.ecoenchants.enchantments.ecoenchants.normal;
+
+import com.destroystokyo.paper.event.player.PlayerElytraBoostEvent;
+import com.willfp.ecoenchants.enchantments.EcoEnchant;
+import com.willfp.ecoenchants.enchantments.EcoEnchantBuilder;
+import com.willfp.ecoenchants.enchantments.util.EnchantChecks;
+import com.willfp.ecoenchants.enchantments.util.EnchantmentUtils;
+import com.willfp.ecoenchants.util.optional.Prerequisite;
+import org.bukkit.event.EventHandler;
+
+public class Economical extends EcoEnchant {
+ public Economical() {
+ super(
+ new EcoEnchantBuilder("economical", EnchantmentType.NORMAL, 5.0),
+ new Prerequisite[]{Prerequisite.HasPaper}
+ );
+ }
+
+ @EventHandler
+ public void onElytraBoost(PlayerElytraBoostEvent event) {
+ if(EnchantmentUtils.passedChance(this, EnchantChecks.getArmorPoints(event.getPlayer(), this)))
+ event.setShouldConsume(false);
+ }
+}
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java
index f31933fd..b5cf76b7 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/loader/Loader.java
@@ -5,7 +5,6 @@ import com.willfp.ecoenchants.EcoEnchantsPlugin;
import com.willfp.ecoenchants.command.commands.CommandEcodebug;
import com.willfp.ecoenchants.command.commands.CommandEcoreload;
import com.willfp.ecoenchants.command.commands.CommandEnchantinfo;
-import com.willfp.ecoenchants.command.tabcompleters.TabCompleterEnchantinfo;
import com.willfp.ecoenchants.config.ConfigManager;
import com.willfp.ecoenchants.display.EnchantDisplay;
import com.willfp.ecoenchants.display.packets.PacketOpenWindowMerchant;
@@ -44,6 +43,7 @@ import com.willfp.ecoenchants.nms.TridentStack;
import com.willfp.ecoenchants.util.Logger;
import com.willfp.ecoenchants.util.UpdateChecker;
import com.willfp.ecoenchants.util.interfaces.EcoRunnable;
+import com.willfp.ecoenchants.util.optional.Prerequisite;
import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
import org.bstats.bukkit.Metrics;
import org.bukkit.Bukkit;
@@ -70,30 +70,6 @@ public class Loader {
Logger.info("");
Logger.info("==========================================");
- /*
- Check for paper
- */
-
- boolean isPapermc = false;
- try {
- isPapermc = Class.forName("com.destroystokyo.paper.VersionHistoryManager$VersionData") != null;
- } catch (ClassNotFoundException ignored) {}
-
- if (!isPapermc) {
- Bukkit.getScheduler().runTaskLater(EcoEnchantsPlugin.getInstance(), () -> {
- Logger.info("");
- Logger.info("----------------------------");
- Logger.info("");
- Logger.error("You don't seem to be running paper!");
- Logger.error("Paper is strongly recommended for all servers,");
- Logger.error("and enchantments like Drill may not function properly without it");
- Logger.error("Download Paper from §fhttps://papermc.io");
- Logger.info("");
- Logger.info("----------------------------");
- Logger.info("");
- }, 1);
- }
-
/*
Load Configs
*/
@@ -283,7 +259,7 @@ public class Loader {
Logger.info("Loading Commands...");
new CommandEcoreload().register();
new CommandEcodebug().register();
- new CommandEnchantinfo().setTab(new TabCompleterEnchantinfo()).register();
+ new CommandEnchantinfo().register();
Logger.info("");
/*
@@ -412,6 +388,23 @@ public class Loader {
Logger.info("Spartan: §9DISABLED");
}
+ /*
+ Check for paper
+ */
+
+ if (!Prerequisite.HasPaper.isMet()) {
+ Logger.info("");
+ Logger.info("----------------------------");
+ Logger.info("");
+ Logger.error("You don't seem to be running paper!");
+ Logger.error("Paper is strongly recommended for all servers,");
+ Logger.error("and enchantments like Drill may not function properly without it");
+ Logger.error("Download Paper from §fhttps://papermc.io");
+ Logger.info("");
+ Logger.info("----------------------------");
+ Logger.info("");
+ }
+
Logger.info("");
}
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/nms/BlockBreak.java b/Plugin/src/main/java/com/willfp/ecoenchants/nms/BlockBreak.java
index 175e7405..bd1fda29 100644
--- a/Plugin/src/main/java/com/willfp/ecoenchants/nms/BlockBreak.java
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/nms/BlockBreak.java
@@ -1,6 +1,5 @@
package com.willfp.ecoenchants.nms;
-
import com.willfp.ecoenchants.nms.API.BlockBreakWrapper;
import org.bukkit.Bukkit;
import org.bukkit.block.Block;
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/ClassUtils.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/ClassUtils.java
new file mode 100644
index 00000000..bffab7f5
--- /dev/null
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/ClassUtils.java
@@ -0,0 +1,12 @@
+package com.willfp.ecoenchants.util;
+
+public class ClassUtils {
+ public static boolean exists(String className) {
+ try {
+ Class.forName(className);
+ return true;
+ } catch (ClassNotFoundException e) {
+ return false;
+ }
+ }
+}
diff --git a/Plugin/src/main/java/com/willfp/ecoenchants/util/optional/Prerequisite.java b/Plugin/src/main/java/com/willfp/ecoenchants/util/optional/Prerequisite.java
new file mode 100644
index 00000000..18cbf610
--- /dev/null
+++ b/Plugin/src/main/java/com/willfp/ecoenchants/util/optional/Prerequisite.java
@@ -0,0 +1,29 @@
+package com.willfp.ecoenchants.util.optional;
+
+import com.willfp.ecoenchants.util.ClassUtils;
+import org.bukkit.Bukkit;
+
+public enum Prerequisite {
+ MinVer1_16(false),
+ HasPaper(false),
+ Dummy(false);
+
+ private boolean isMet;
+
+ Prerequisite(boolean isMet) {
+ this.isMet = isMet;
+ }
+
+ public boolean isMet() {
+ return isMet;
+ }
+
+ private void setMet(boolean met) {
+ isMet = met;
+ }
+
+ static {
+ MinVer1_16.setMet(!Bukkit.getServer().getClass().getPackage().getName().split("\\.")[3].contains("15"));
+ HasPaper.setMet(ClassUtils.exists("com.destroystokyo.paper.event.player.PlayerElytraBoostEvent"));
+ }
+}
diff --git a/Plugin/src/main/resources/enchants/normal/economical.yml b/Plugin/src/main/resources/enchants/normal/economical.yml
new file mode 100644
index 00000000..ec4adb4a
--- /dev/null
+++ b/Plugin/src/main/resources/enchants/normal/economical.yml
@@ -0,0 +1,25 @@
+#
+# Economical EcoEnchant
+#
+
+config-version: 5.0 # Don't edit this.
+
+name: "Economical"
+description: Chance to not consume fireworks while boosting.
+enabled: true
+
+obtaining:
+ table: true
+ villager: true
+ loot: true
+ rarity: epic
+
+general-config:
+ targets:
+ - elytra
+ grindstoneable: true
+ conflicts: []
+ maximum-level: 4
+
+config:
+ chance-per-level: 20
\ No newline at end of file
diff --git a/Plugin/src/main/resources/plugin.yml b/Plugin/src/main/resources/plugin.yml
index d64f6a97..6a8070f0 100644
--- a/Plugin/src/main/resources/plugin.yml
+++ b/Plugin/src/main/resources/plugin.yml
@@ -853,4 +853,7 @@ permissions:
default: true
ecoenchants.fromtable.fetching:
description: Allows getting fetching from an enchanting table
+ default: true
+ ecoenchants.fromtable.economical:
+ description: Allows getting economical from an enchanting table
default: true
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 9d5fc46f..d35718ec 100644
--- a/pom.xml
+++ b/pom.xml
@@ -60,6 +60,10 @@
dmulloy2-repo
https://repo.dmulloy2.net/nexus/repository/public/
+
+ papermc
+ https://papermc.io/repo/repository/maven-public/
+