diff --git a/API/pom.xml b/API/pom.xml
index 92e332d..f36a3f5 100644
--- a/API/pom.xml
+++ b/API/pom.xml
@@ -5,7 +5,7 @@
ExcellentEnchants
su.nightexpress.excellentenchants
- 3.6.5
+ 4.0.0
4.0.0
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/DistributionMode.java b/API/src/main/java/su/nightexpress/excellentenchants/api/DistributionMode.java
new file mode 100644
index 0000000..1ad0f35
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/DistributionMode.java
@@ -0,0 +1,7 @@
+package su.nightexpress.excellentenchants.api;
+
+public enum DistributionMode {
+
+ VANILLA,
+ CUSTOM
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ObtainType.java b/API/src/main/java/su/nightexpress/excellentenchants/api/DistributionWay.java
similarity index 67%
rename from API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ObtainType.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/DistributionWay.java
index da894e1..534e84b 100644
--- a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ObtainType.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/DistributionWay.java
@@ -1,18 +1,18 @@
-package su.nightexpress.excellentenchants.api.enchantment;
+package su.nightexpress.excellentenchants.api;
import org.jetbrains.annotations.NotNull;
-public enum ObtainType {
+public enum DistributionWay {
ENCHANTING("Enchanting_Table"),
VILLAGER("Villagers"),
LOOT_GENERATION("Loot_Generation"),
FISHING("Fishing"),
- MOB_SPAWNING("Mob_Spawning");
+ MOB_EQUIPMENT("Mob_Equipment");
private final String pathName;
- ObtainType(@NotNull String pathName) {
+ DistributionWay(@NotNull String pathName) {
this.pathName = pathName;
}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/Modifier.java b/API/src/main/java/su/nightexpress/excellentenchants/api/Modifier.java
new file mode 100644
index 0000000..d832bc4
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/Modifier.java
@@ -0,0 +1,148 @@
+package su.nightexpress.excellentenchants.api;
+
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.nightcore.config.ConfigValue;
+import su.nightexpress.nightcore.config.FileConfig;
+import su.nightexpress.nightcore.util.StringUtil;
+
+public class Modifier {
+
+ private double base;
+ private double perLevel;
+ private double step;
+ private double cap;
+ private ModifierAction action;
+
+ public Modifier(double base, double perLevel, double step, double cap, @NotNull ModifierAction action) {
+ this.setBase(base);
+ this.setPerLevel(perLevel);
+ this.setStep(step);
+ this.setCap(cap);
+ this.setAction(action);
+ }
+
+ @NotNull
+ public static Modifier add(double base, double perLevel, double step) {
+ return add(base, perLevel, step, -1);
+ }
+
+ @NotNull
+ public static Modifier multiply(double base, double perLevel, double step) {
+ return multiply(base, perLevel, step, -1);
+ }
+
+ @NotNull
+ public static Modifier add(double base, double perLevel, double step, double cap) {
+ return new Modifier(base, perLevel, step, cap, ModifierAction.ADD);
+ }
+
+ @NotNull
+ public static Modifier multiply(double base, double perLevel, double step, double cap) {
+ return new Modifier(base, perLevel, step, cap, ModifierAction.MULTIPLY);
+ }
+
+ @NotNull
+ public static Modifier read(@NotNull FileConfig cfg, @NotNull String path, @NotNull Modifier def, String ... comments) {
+ return new ConfigValue<>(path,
+ (cfg2, path2, def2) -> Modifier.read(cfg2, path2),
+ (cfg2, path2, mod) -> mod.write(cfg2, path2),
+ def,
+ comments
+ ).read(cfg);
+ }
+
+ @NotNull
+ public static Modifier read(@NotNull FileConfig cfg, @NotNull String path) {
+ double base = ConfigValue.create(path + ".Base", 0D,
+ "Start modifier value."
+ ).read(cfg);
+
+ double perLevel = ConfigValue.create(path + ".Per_Level", 0D,
+ "Additional value calculated by enchantment level step (see below). Formula: * "
+ ).read(cfg);
+
+ double step = ConfigValue.create(path + ".Step" , 1D,
+ "Defines level step for 'Per_Level' value calculation. Formula: / "
+ ).read(cfg);
+
+ double cap = ConfigValue.create(path + ".Cap", -1,
+ "Sets a limit for the final (base & per level calculations) value.",
+ "Set '-1' for no limit."
+ ).read(cfg);
+
+ ModifierAction action = ConfigValue.create(path + ".Action", ModifierAction.class, ModifierAction.ADD,
+ "Sets action performed between 'Base' and final 'Per_Level' values.",
+ "Available types: " + StringUtil.inlineEnum(ModifierAction.class, ", ")
+ ).read(cfg);
+
+ return new Modifier(base, perLevel, step, cap, action);
+ }
+
+ public void write(@NotNull FileConfig cfg, @NotNull String path) {
+ cfg.set(path + ".Base", this.getBase());
+ cfg.set(path + ".Per_Level", this.getPerLevel());
+ cfg.set(path + ".Step", this.getStep());
+ cfg.set(path + ".Cap", this.getCap());
+ cfg.set(path + ".Action", this.getAction().name());
+ }
+
+ public double getValue(int level) {
+ if (/*level == 1 || */this.perLevel == 0D) return this.capValue(this.getBase());
+
+ //level -= 1;
+
+ double step = this.getStep() == 0D ? 1D : Math.floor((double) level / this.getStep());
+ double result = this.action.math(this.getBase(), this.getPerLevel() * step);
+
+ return this.capValue(result);
+ }
+
+ public double capValue(double result) {
+ return this.cap > 0 ? Math.min(result, this.cap) : result;
+ }
+
+ public int getIntValue(int level) {
+ return (int) this.getValue(level);
+ }
+
+ public double getBase() {
+ return this.base;
+ }
+
+ public void setBase(double base) {
+ this.base = base;
+ }
+
+ public double getPerLevel() {
+ return this.perLevel;
+ }
+
+ public void setPerLevel(double perLevel) {
+ this.perLevel = perLevel;
+ }
+
+ public double getStep() {
+ return step;
+ }
+
+ public void setStep(double step) {
+ this.step = step;
+ }
+
+ public double getCap() {
+ return cap;
+ }
+
+ public void setCap(double cap) {
+ this.cap = cap;
+ }
+
+ @NotNull
+ public ModifierAction getAction() {
+ return this.action;
+ }
+
+ public void setAction(@NotNull ModifierAction action) {
+ this.action = action;
+ }
+}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/ModifierAction.java b/API/src/main/java/su/nightexpress/excellentenchants/api/ModifierAction.java
similarity index 88%
rename from Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/ModifierAction.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/ModifierAction.java
index 06b719d..b033755 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/util/ModifierAction.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/ModifierAction.java
@@ -1,4 +1,4 @@
-package su.nightexpress.excellentenchants.enchantment.util;
+package su.nightexpress.excellentenchants.api;
import org.jetbrains.annotations.NotNull;
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/EnchantmentData.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/EnchantmentData.java
new file mode 100644
index 0000000..d5c1695
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/EnchantmentData.java
@@ -0,0 +1,193 @@
+package su.nightexpress.excellentenchants.api.enchantment;
+
+import org.bukkit.World;
+import org.bukkit.enchantments.Enchantment;
+import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemStack;
+import org.bukkit.inventory.meta.ItemMeta;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import su.nightexpress.excellentenchants.api.Modifier;
+import su.nightexpress.excellentenchants.api.enchantment.distribution.DistributionOptions;
+import su.nightexpress.nightcore.config.FileConfig;
+import su.nightexpress.nightcore.util.Lists;
+import su.nightexpress.nightcore.util.placeholder.PlaceholderMap;
+
+import java.util.List;
+import java.util.Set;
+
+public interface EnchantmentData {
+
+ @NotNull PlaceholderMap getPlaceholders(int level);
+
+ @NotNull FileConfig getConfig();
+
+ boolean load();
+
+ boolean checkServerRequirements();
+
+ boolean isAvailableToUse(@NotNull LivingEntity entity);
+
+ boolean isAvailableToUse(@NotNull World world);
+
+ boolean checkEnchantCategory(@NotNull ItemStack item);
+
+ boolean checkItemCategory(@NotNull ItemStack item);
+
+ @NotNull DistributionOptions getDistributionOptions();
+
+ @NotNull Rarity getRarity();
+
+ void setRarity(@NotNull Rarity rarity);
+
+ @NotNull String getId();
+
+ @NotNull String getName();
+
+ @NotNull
+ default String getNameFormatted(int level) {
+ return this.getNameFormatted(level, -1);
+ }
+
+ @NotNull String getNameFormatted(int level, int charges);
+
+ @NotNull List getDescription();
+
+ @NotNull List getDescriptionFormatted();
+
+ @NotNull List getDescriptionReplaced(int level);
+
+ @NotNull EnchantmentTarget getCategory();
+
+ @NotNull Enchantment getEnchantment();
+
+ void setEnchantment(@NotNull Enchantment enchantment);
+
+ ItemCategory[] getItemCategories();
+
+ EquipmentSlot[] getSlots();
+
+ default boolean hasConflicts() {
+ return !this.getConflicts().isEmpty();
+ }
+
+ @NotNull Set getConflicts();
+
+ int getMinLevel();
+
+ int getMaxLevel();
+
+ //int getMaxMergeLevel();
+
+ //int getAnvilMergeCost(int level);
+
+ int getMinCost(int level);
+
+ int getMaxCost(int level);
+
+ default boolean isCurse() {
+ return false;
+ }
+
+ boolean isTreasure();
+
+ boolean hasVisualEffects();
+
+ boolean isChargesEnabled();
+
+ boolean isChargesCustomFuel();
+
+ int getChargesMax(int level);
+
+ int getChargesConsumeAmount(int level);
+
+ int getChargesRechargeAmount(int level);
+
+ @NotNull ItemStack getChargesFuel();
+
+ boolean isChargesFuel(@NotNull ItemStack item);
+
+ default int getCharges(@NotNull ItemStack item) {
+ ItemMeta meta = item.getItemMeta();
+ return meta == null ? 0 : this.getCharges(meta);
+ }
+
+ int getCharges(@NotNull ItemMeta meta);
+
+ void setCharges(@NotNull ItemStack item, int level, int amount);
+
+ boolean isFullOfCharges(@NotNull ItemStack item);
+
+ boolean isOutOfCharges(@NotNull ItemStack item);
+
+ void restoreCharges(@NotNull ItemStack item, int level);
+
+ void fuelCharges(@NotNull ItemStack item, int level);
+
+ void consumeCharges(@NotNull ItemStack item, int level);
+
+ void consumeChargesNoUpdate(@NotNull ItemStack item, int level);
+
+
+
+
+ void setDisplayName(@NotNull String displayName);
+
+ default void setDescription(@NotNull String... description) {
+ this.setDescription(Lists.newList(description));
+ }
+
+ void setDescription(@NotNull List description);
+
+ boolean isHiddenFromList();
+
+ void setHiddenFromList(boolean hiddenFromList);
+
+ void setTreasure(boolean treasure);
+
+ void setStartLevel(int levelMin);
+
+ void setMaxLevel(int levelMax);
+
+ //void setMaxMergeLevel(int maxMergeLevel);
+
+ @NotNull Modifier getMinCost();
+
+ void setMinCost(@NotNull Modifier minCost);
+
+ @NotNull Modifier getMaxCost();
+
+ void setMaxCost(@NotNull Modifier maxCost);
+
+ //@NotNull Modifier getAnvilMergeCost();
+
+ //void setAnvilMergeCost(@NotNull Modifier anvilMergeCost);
+
+ default void setConflicts(@NotNull String... conflicts) {
+ this.setConflicts(Lists.newSet(conflicts));
+ }
+
+ void setConflicts(@NotNull Set conflicts);
+
+ void setVisualEffects(boolean visualEffects);
+
+ void setChargesEnabled(boolean chargesEnabled);
+
+ void setChargesCustomFuel(boolean chargesCustomFuel);
+
+ @NotNull Modifier getChargesMax();
+
+ void setChargesMax(@NotNull Modifier chargesMax);
+
+ void setChargesFuel(@Nullable ItemStack chargesFuel);
+
+ @NotNull Modifier getChargesConsumeAmount();
+
+ void setChargesConsumeAmount(@NotNull Modifier chargesConsumeAmount);
+
+ @NotNull Modifier getChargesRechargeAmount();
+
+ void setChargesRechargeAmount(@NotNull Modifier chargesRechargeAmount);
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java
deleted file mode 100644
index 391d5db..0000000
--- a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment;
-
-import org.bukkit.Keyed;
-import org.bukkit.enchantments.EnchantmentTarget;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.inventory.EquipmentSlot;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.config.JYML;
-
-import java.util.List;
-import java.util.Set;
-
-public interface IEnchantment extends Keyed {
-
- boolean isAvailableToUse(@NotNull LivingEntity entity);
-
- @NotNull JYML getConfig();
-
- @NotNull String getId();
-
- @NotNull String getDisplayName();
-
- @NotNull String getNameFormatted(int level);
-
- @NotNull String getNameFormatted(int level, int charges);
-
- @NotNull List getDescription();
-
- @NotNull List getDescription(int level);
-
- @NotNull Set getConflicts();
-
- @NotNull ITier getTier();
-
- @NotNull EnchantmentTarget getCategory();
-
- ItemCategory[] getFitItemTypes();
-
- int getMaxLevel();
-
- int getStartLevel();
-
- int getLevelByEnchantCost(int expLevel);
-
- double getObtainChance(@NotNull ObtainType obtainType);
-
- int getObtainLevelMin(@NotNull ObtainType obtainType);
-
- int getObtainLevelMax(@NotNull ObtainType obtainType);
-
- int generateLevel(@NotNull ObtainType obtainType);
-
- int getAnvilMergeCost(int level);
-
- //@Deprecated
- //boolean conflictsWith(@NotNull Enchantment enchantment);
-
- boolean checkEnchantCategory(@NotNull ItemStack item);
-
- boolean checkItemCategory(@NotNull ItemStack item);
-
- boolean isCurse();
-
- boolean isTreasure();
-
- boolean isTradeable();
-
- boolean isDiscoverable();
-
- boolean isChargesEnabled();
-
- int getChargesMax(int level);
-
- int getChargesConsumeAmount(int level);
-
- int getChargesRechargeAmount(int level);
-
- @NotNull ItemStack getChargesFuel();
-
- boolean isChargesFuel(@NotNull ItemStack item);
-
- int getCharges(@NotNull ItemStack item);
-
- boolean isFullOfCharges(@NotNull ItemStack item);
-
- boolean isOutOfCharges(@NotNull ItemStack item);
-
- void consumeCharges(@NotNull ItemStack item, int level);
-
- void consumeChargesNoUpdate(@NotNull ItemStack item, int level);
-
- EquipmentSlot[] getSlots();
-}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ITier.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ITier.java
deleted file mode 100644
index 23d34ef..0000000
--- a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ITier.java
+++ /dev/null
@@ -1,21 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment;
-
-import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.placeholder.Placeholder;
-
-import java.util.Map;
-
-public interface ITier extends Placeholder {
-
- @NotNull String getId();
-
- int getPriority();
-
- @NotNull String getName();
-
- @NotNull String getColor();
-
- @NotNull Map getChance();
-
- double getChance(@NotNull ObtainType obtainType);
-}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ItemCategory.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ItemCategory.java
index 05c73fb..047fd82 100644
--- a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ItemCategory.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/ItemCategory.java
@@ -3,7 +3,7 @@ package su.nightexpress.excellentenchants.api.enchantment;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.utils.ItemUtil;
+import su.nightexpress.nightcore.util.ItemUtil;
import java.util.function.Predicate;
@@ -24,6 +24,7 @@ public enum ItemCategory {
PICKAXE(ItemUtil::isPickaxe),
SHOVEL(ItemUtil::isShovel),
FISHING_ROD(ItemUtil::isFishingRod),
+ SHIELD(itemStack -> itemStack.getType() == Material.SHIELD),
//@Deprecated WEAPON(item -> SWORD.isIncluded(item) || TRIDENT.isIncluded(item)),
TOOL(ItemUtil::isTool),
@@ -46,83 +47,7 @@ public enum ItemCategory {
this.predicate = predicate;
}
- @Deprecated
- public void patchPredicate(@NotNull Predicate extra) {
- //this.setPredicate(item -> this.getPredicate().test(item) || (extra.test(item)));
- }
-
- /*public EquipmentSlot[] getSlots() {
- return switch (this) {
- case BOW, CROSSBOW, TRIDENT, FISHING_ROD, WEAPON, TOOL, HOE, PICKAXE, AXE, SWORD, SHOVEL ->
- new EquipmentSlot[]{EquipmentSlot.HAND};
- case HELMET -> new EquipmentSlot[]{EquipmentSlot.HEAD};
- case CHESTPLATE, ELYTRA -> new EquipmentSlot[]{EquipmentSlot.CHEST};
- case LEGGINGS -> new EquipmentSlot[]{EquipmentSlot.LEGS};
- case BOOTS -> new EquipmentSlot[]{EquipmentSlot.FEET};
- case ARMOR -> new EquipmentSlot[]{EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET};
- case UNIVERSAL -> new EquipmentSlot[]{EquipmentSlot.HAND, EquipmentSlot.HEAD, EquipmentSlot.CHEST, EquipmentSlot.LEGS, EquipmentSlot.FEET};
- };
- }
-
- @NotNull
- public EnchantmentTarget getEnchantmentTarget() {
- return switch (this) {
- case ARMOR -> EnchantmentTarget.ARMOR;
- case BOOTS -> EnchantmentTarget.ARMOR_FEET;
- case LEGGINGS -> EnchantmentTarget.ARMOR_LEGS;
- case CHESTPLATE, ELYTRA -> EnchantmentTarget.ARMOR_TORSO;
- case HELMET -> EnchantmentTarget.ARMOR_HEAD;
- case WEAPON, SWORD -> EnchantmentTarget.WEAPON;
- case TOOL, AXE, HOE, SHOVEL, PICKAXE -> EnchantmentTarget.TOOL;
- case BOW -> EnchantmentTarget.BOW;
- case FISHING_ROD -> EnchantmentTarget.FISHING_ROD;
- case TRIDENT -> EnchantmentTarget.TRIDENT;
- case CROSSBOW -> EnchantmentTarget.CROSSBOW;
- case UNIVERSAL -> EnchantmentTarget.WEARABLE;
- };
- }
-
- @NotNull
- public static FitItemType getByEnchantmentTarget(@NotNull EnchantmentTarget target) {
- return switch (target) {
- case ARMOR -> ARMOR;
- case ARMOR_FEET -> BOOTS;
- case ARMOR_LEGS -> LEGGINGS;
- case ARMOR_TORSO -> CHESTPLATE;
- case ARMOR_HEAD -> HELMET;
- case WEAPON -> WEAPON;
- case TOOL -> TOOL;
- case BOW -> BOW;
- case FISHING_ROD -> FISHING_ROD;
- case TRIDENT -> TRIDENT;
- case CROSSBOW -> CROSSBOW;
- case BREAKABLE, WEARABLE -> UNIVERSAL;
- default -> throw new IllegalStateException("Unexpected value: " + target);
- };
- }*/
-
public boolean isIncluded(@NotNull ItemStack item) {
return this.getPredicate().test(item);
-
- /*return switch (this) {
- case UNIVERSAL -> ARMOR.isIncluded(item) || WEAPON.isIncluded(item) || TOOL.isIncluded(item) || BOW.isIncluded(item) || FISHING_ROD.isIncluded(item) || ELYTRA.isIncluded(item);
- case HELMET -> ItemUtil.isHelmet(item);
- case CHESTPLATE -> ItemUtil.isChestplate(item) || (Config.ENCHANTMENTS_ITEM_CHESTPLATE_ENCHANTS_TO_ELYTRA.get() && ELYTRA.isIncluded(item));
- case LEGGINGS -> ItemUtil.isLeggings(item);
- case BOOTS -> ItemUtil.isBoots(item);
- case ELYTRA -> item.getType() == Material.ELYTRA;
- case WEAPON -> SWORD.isIncluded(item) || ItemUtil.isTrident(item);
- case TOOL -> ItemUtil.isTool(item);
- case ARMOR -> ItemUtil.isArmor(item);
- case SWORD -> ItemUtil.isSword(item) || (Config.ENCHANTMENTS_ITEM_SWORD_ENCHANTS_TO_AXES.get() && AXE.isIncluded(item));
- case TRIDENT -> ItemUtil.isTrident(item);
- case AXE -> ItemUtil.isAxe(item);
- case BOW -> item.getType() == Material.BOW || (Config.ENCHANTMENTS_ITEM_BOW_ENCHANTS_TO_CROSSBOW.get() && CROSSBOW.isIncluded(item));
- case CROSSBOW -> item.getType() == Material.CROSSBOW;
- case HOE -> ItemUtil.isHoe(item);
- case PICKAXE -> ItemUtil.isPickaxe(item);
- case SHOVEL -> ItemUtil.isShovel(item);
- case FISHING_ROD -> item.getType() == Material.FISHING_ROD;
- };*/
}
}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Rarity.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Rarity.java
index 1725955..add23a7 100644
--- a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Rarity.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Rarity.java
@@ -1,5 +1,11 @@
package su.nightexpress.excellentenchants.api.enchantment;
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.nightcore.util.random.Rnd;
+
+import java.util.HashMap;
+import java.util.Map;
+
public enum Rarity {
COMMON(10),
@@ -7,7 +13,7 @@ public enum Rarity {
RARE(2),
VERY_RARE(1);
- private final int weight;
+ private int weight;
Rarity(int weight) {
this.weight = weight;
@@ -16,4 +22,19 @@ public enum Rarity {
public int getWeight() {
return this.weight;
}
+
+ public void setWeight(int weight) {
+ this.weight = weight;
+ }
+
+ @NotNull
+ public static Rarity getByWeight() {
+ Map map = new HashMap<>();
+
+ for (Rarity rarity : Rarity.values()) {
+ map.put(rarity, (double) rarity.getWeight());
+ }
+
+ return Rnd.getByWeight(map);
+ }
}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowData.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowData.java
new file mode 100644
index 0000000..9e41d5d
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowData.java
@@ -0,0 +1,14 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.nightcore.util.wrapper.UniParticle;
+
+public interface ArrowData {
+
+ @NotNull ArrowSettings getArrowSettings();
+
+ @NotNull
+ default UniParticle getProjectileTrail() {
+ return this.getArrowSettings().getProjectileTrail();
+ }
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowSettings.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowSettings.java
new file mode 100644
index 0000000..2be85b5
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ArrowSettings.java
@@ -0,0 +1,9 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.nightcore.util.wrapper.UniParticle;
+
+public interface ArrowSettings {
+
+ @NotNull UniParticle getProjectileTrail();
+}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Chanced.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceData.java
similarity index 54%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Chanced.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceData.java
index 21f2b32..3017045 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Chanced.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceData.java
@@ -1,10 +1,10 @@
-package su.nightexpress.excellentenchants.api.enchantment.meta;
+package su.nightexpress.excellentenchants.api.enchantment.data;
import org.jetbrains.annotations.NotNull;
-public interface Chanced {
+public interface ChanceData {
- @NotNull Chanced getChanceImplementation();
+ @NotNull ChanceSettings getChanceSettings();
/*@NotNull
default UnaryOperator replacePlaceholders(int level) {
@@ -12,10 +12,10 @@ public interface Chanced {
}*/
default double getTriggerChance(int level) {
- return this.getChanceImplementation().getTriggerChance(level);
+ return this.getChanceSettings().getTriggerChance(level);
}
default boolean checkTriggerChance(int level) {
- return getChanceImplementation().checkTriggerChance(level);
+ return getChanceSettings().checkTriggerChance(level);
}
}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceSettings.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceSettings.java
new file mode 100644
index 0000000..b15dac8
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/ChanceSettings.java
@@ -0,0 +1,8 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+public interface ChanceSettings {
+
+ double getTriggerChance(int level);
+
+ boolean checkTriggerChance(int level);
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicData.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicData.java
new file mode 100644
index 0000000..e92a5e2
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicData.java
@@ -0,0 +1,24 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+import org.jetbrains.annotations.NotNull;
+
+public interface PeriodicData {
+
+ @NotNull PeriodicSettings getPeriodSettings();
+
+ default long getInterval() {
+ return this.getPeriodSettings().getInterval();
+ }
+
+ default long getNextTriggerTime() {
+ return this.getPeriodSettings().getNextTriggerTime();
+ }
+
+ default boolean isTriggerTime() {
+ return this.getPeriodSettings().isTriggerTime();
+ }
+
+ default void updateTriggerTime() {
+ this.getPeriodSettings().updateTriggerTime();
+ }
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicSettings.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicSettings.java
new file mode 100644
index 0000000..31cfad9
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PeriodicSettings.java
@@ -0,0 +1,12 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+public interface PeriodicSettings {
+
+ long getInterval();
+
+ long getNextTriggerTime();
+
+ boolean isTriggerTime();
+
+ void updateTriggerTime();
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionData.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionData.java
new file mode 100644
index 0000000..a747352
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionData.java
@@ -0,0 +1,35 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.jetbrains.annotations.NotNull;
+
+public interface PotionData {
+
+ @NotNull PotionSettings getPotionSettings();
+
+ default boolean isPermanent() {
+ return this.getPotionSettings().isPermanent();
+ }
+
+ default PotionEffectType getEffectType() {
+ return this.getPotionSettings().getEffectType();
+ }
+
+ default int getEffectAmplifier(int level) {
+ return this.getPotionSettings().getEffectAmplifier(level);
+ }
+
+ default int getEffectDuration(int level) {
+ return this.getPotionSettings().getEffectDuration(level);
+ }
+
+ default PotionEffect createEffect(int level) {
+ return this.getPotionSettings().createEffect(level);
+ }
+
+ default boolean addEffect(@NotNull LivingEntity target, int level) {
+ return this.getPotionSettings().addEffect(target, level);
+ }
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionSettings.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionSettings.java
new file mode 100644
index 0000000..727bea2
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/data/PotionSettings.java
@@ -0,0 +1,21 @@
+package su.nightexpress.excellentenchants.api.enchantment.data;
+
+import org.bukkit.entity.LivingEntity;
+import org.bukkit.potion.PotionEffect;
+import org.bukkit.potion.PotionEffectType;
+import org.jetbrains.annotations.NotNull;
+
+public interface PotionSettings {
+
+ boolean isPermanent();
+
+ PotionEffectType getEffectType();
+
+ int getEffectAmplifier(int level);
+
+ int getEffectDuration(int level);
+
+ PotionEffect createEffect(int level);
+
+ boolean addEffect(@NotNull LivingEntity target, int level);
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/DistributionOptions.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/DistributionOptions.java
new file mode 100644
index 0000000..84d9174
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/DistributionOptions.java
@@ -0,0 +1,9 @@
+package su.nightexpress.excellentenchants.api.enchantment.distribution;
+
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.nightcore.config.FileConfig;
+
+public interface DistributionOptions {
+
+ void load(@NotNull FileConfig config);
+}
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/VanillaOptions.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/VanillaOptions.java
new file mode 100644
index 0000000..14be8c9
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/distribution/VanillaOptions.java
@@ -0,0 +1,12 @@
+package su.nightexpress.excellentenchants.api.enchantment.distribution;
+
+public interface VanillaOptions extends DistributionOptions {
+
+ boolean isDiscoverable();
+
+ void setDiscoverable(boolean discoverable);
+
+ boolean isTradeable();
+
+ void setTradeable(boolean tradeable);
+}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java
similarity index 78%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java
index 32de3aa..58d6ebd 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockBreakEnchant.java
@@ -5,9 +5,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockBreakEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface BlockBreakEnchant extends IEnchantment {
+public interface BlockBreakEnchant extends EnchantmentData {
boolean onBreak(@NotNull BlockBreakEvent event, @NotNull LivingEntity player, @NotNull ItemStack item, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java
similarity index 78%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java
index e8c3268..7522603 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BlockDropEnchant.java
@@ -5,9 +5,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface BlockDropEnchant extends IEnchantment {
+public interface BlockDropEnchant extends EnchantmentData {
boolean onDrop(@NotNull BlockDropItemEvent event, @NotNull LivingEntity player, @NotNull ItemStack item, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java
similarity index 90%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java
index 4653606..b5c5f16 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/BowEnchant.java
@@ -8,9 +8,9 @@ import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.ProjectileHitEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface BowEnchant extends IEnchantment {
+public interface BowEnchant extends EnchantmentData {
boolean onShoot(@NotNull EntityShootBowEvent event, @NotNull LivingEntity shooter, @NotNull ItemStack bow, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java
similarity index 87%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java
index 54e9535..d298def 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/CombatEnchant.java
@@ -5,9 +5,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface CombatEnchant extends IEnchantment {
+public interface CombatEnchant extends EnchantmentData {
boolean onAttack(@NotNull EntityDamageByEntityEvent event,
@NotNull LivingEntity damager, @NotNull LivingEntity victim,
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java
similarity index 79%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java
index 8099f3f..beca835 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DamageEnchant.java
@@ -5,9 +5,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface DamageEnchant extends IEnchantment {
+public interface DamageEnchant extends EnchantmentData {
boolean onDamage(@NotNull EntityDamageEvent event, @NotNull LivingEntity entity, @NotNull ItemStack item, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java
similarity index 87%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java
index e961ccc..97be5c7 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/DeathEnchant.java
@@ -7,9 +7,9 @@ import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.event.entity.EntityResurrectEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface DeathEnchant extends IEnchantment {
+public interface DeathEnchant extends EnchantmentData {
boolean onDeath(@NotNull EntityDeathEvent event, @NotNull LivingEntity entity, ItemStack item, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java
similarity index 76%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java
index cc45db4..69b91ea 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/FishingEnchant.java
@@ -4,9 +4,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerFishEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface FishingEnchant extends IEnchantment {
+public interface FishingEnchant extends EnchantmentData {
boolean onFishing(@NotNull PlayerFishEvent event, @NotNull ItemStack item, int level);
diff --git a/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java
new file mode 100644
index 0000000..4d37a3b
--- /dev/null
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java
@@ -0,0 +1,7 @@
+package su.nightexpress.excellentenchants.api.enchantment.type;
+
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
+
+public interface GenericEnchant extends EnchantmentData {
+
+}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java
similarity index 79%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java
index e4e526c..57e2fc6 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/InteractEnchant.java
@@ -5,9 +5,9 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.player.PlayerInteractEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
-public interface InteractEnchant extends IEnchantment {
+public interface InteractEnchant extends EnchantmentData {
boolean onInteract(@NotNull PlayerInteractEvent event, @NotNull LivingEntity entity, @NotNull ItemStack item, int level);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java
similarity index 55%
rename from Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java
rename to API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java
index 28c190d..c9ce7af 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java
+++ b/API/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/PassiveEnchant.java
@@ -3,10 +3,10 @@ package su.nightexpress.excellentenchants.api.enchantment.type;
import org.bukkit.entity.LivingEntity;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
-import su.nightexpress.excellentenchants.api.enchantment.meta.Periodic;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
+import su.nightexpress.excellentenchants.api.enchantment.data.PeriodicData;
-public interface PassiveEnchant extends IEnchantment, Periodic {
+public interface PassiveEnchant extends EnchantmentData, PeriodicData {
boolean onTrigger(@NotNull LivingEntity entity, @NotNull ItemStack item, int level);
}
diff --git a/Core/pom.xml b/Core/pom.xml
index ac556bf..3cb4530 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -5,15 +5,16 @@
ExcellentEnchants
su.nightexpress.excellentenchants
- 3.6.5
+ 4.0.0
4.0.0
Core
- 16
- 16
+ 17
+ 17
+ UTF-8
@@ -54,7 +55,7 @@
io.lumine
Mythic-Dist
- 5.0.1-SNAPSHOT
+ 5.6.0-SNAPSHOT
provided
@@ -72,37 +73,32 @@
su.nightexpress.excellentenchants
API
- 3.6.5
+ 4.0.0
su.nightexpress.excellentenchants
NMS
- 3.6.5
-
-
- su.nightexpress.excellentenchants
- V1_18_R2
- 3.6.5
+ 4.0.0
su.nightexpress.excellentenchants
V1_19_R3
- 3.6.5
+ 4.0.0
su.nightexpress.excellentenchants
V1_20_R1
- 3.6.5
+ 4.0.0
su.nightexpress.excellentenchants
V1_20_R2
- 3.6.5
+ 4.0.0
su.nightexpress.excellentenchants
V1_20_R3
- 3.6.5
+ 4.0.0
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsAPI.java b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsAPI.java
deleted file mode 100644
index a7ccda1..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsAPI.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package su.nightexpress.excellentenchants;
-
-import org.jetbrains.annotations.NotNull;
-import su.nightexpress.excellentenchants.enchantment.EnchantManager;
-import su.nightexpress.excellentenchants.tier.TierManager;
-
-public class ExcellentEnchantsAPI {
-
- public static final ExcellentEnchants PLUGIN = ExcellentEnchants.getPlugin(ExcellentEnchants.class);
-
- @NotNull
- public static EnchantManager getEnchantManager() {
- return PLUGIN.getEnchantManager();
- }
-
- @NotNull
- public static TierManager getTierManager() {
- return PLUGIN.getTierManager();
- }
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsPlugin.java
similarity index 60%
rename from Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java
rename to Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsPlugin.java
index b875dc9..06d9881 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchantsPlugin.java
@@ -1,20 +1,19 @@
package su.nightexpress.excellentenchants;
import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.Item;
+import org.bukkit.event.block.BlockDropItemEvent;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.NexPlugin;
-import su.nexmedia.engine.Version;
-import su.nexmedia.engine.api.command.GeneralCommand;
-import su.nexmedia.engine.command.list.ReloadSubCommand;
-import su.nexmedia.engine.utils.EngineUtils;
import su.nightexpress.excellentenchants.api.enchantment.ItemCategory;
-import su.nightexpress.excellentenchants.api.enchantment.ObtainType;
+import su.nightexpress.excellentenchants.api.DistributionWay;
+import su.nightexpress.excellentenchants.api.enchantment.Rarity;
import su.nightexpress.excellentenchants.command.BookCommand;
import su.nightexpress.excellentenchants.command.EnchantCommand;
import su.nightexpress.excellentenchants.command.ListCommand;
-import su.nightexpress.excellentenchants.command.TierbookCommand;
+import su.nightexpress.excellentenchants.command.RarityBookCommand;
import su.nightexpress.excellentenchants.config.Config;
+import su.nightexpress.excellentenchants.config.Keys;
import su.nightexpress.excellentenchants.config.Lang;
import su.nightexpress.excellentenchants.enchantment.EnchantManager;
import su.nightexpress.excellentenchants.enchantment.EnchantPopulator;
@@ -23,38 +22,38 @@ import su.nightexpress.excellentenchants.hook.HookId;
import su.nightexpress.excellentenchants.hook.impl.PlaceholderHook;
import su.nightexpress.excellentenchants.hook.impl.ProtocolHook;
import su.nightexpress.excellentenchants.nms.EnchantNMS;
-import su.nightexpress.excellentenchants.nms.v1_18_R2.V1_18_R2;
import su.nightexpress.excellentenchants.nms.v1_19_R3.V1_19_R3;
import su.nightexpress.excellentenchants.nms.v1_20_R1.V1_20_R1;
import su.nightexpress.excellentenchants.nms.v1_20_R2.V1_20_R2;
import su.nightexpress.excellentenchants.nms.v1_20_R3.V1_20_R3;
-import su.nightexpress.excellentenchants.tier.TierManager;
+import su.nightexpress.nightcore.NightPlugin;
+import su.nightexpress.nightcore.command.api.NightPluginCommand;
+import su.nightexpress.nightcore.command.base.ReloadSubCommand;
+import su.nightexpress.nightcore.config.PluginDetails;
+import su.nightexpress.nightcore.util.Plugins;
+import su.nightexpress.nightcore.util.Version;
-public class ExcellentEnchants extends NexPlugin {
-
- // TODO Config option to use minecraft internal enchanting population
- // TODO Custom name format for curse enchants
- // TODO Custom name format for treasure enchants
+public class ExcellentEnchantsPlugin extends NightPlugin {
private EnchantRegistry registry;
private EnchantManager enchantManager;
private EnchantNMS enchantNMS;
- private TierManager tierManager;
-
- @Override
- @NotNull
- protected ExcellentEnchants getSelf() {
- return this;
- }
@Override
public void onLoad() {
super.onLoad();
-
- //this.updateFitItemTypes();
this.registry = new EnchantRegistry(this);
}
+ @Override
+ @NotNull
+ protected PluginDetails getDefaultDetails() {
+ return PluginDetails.create("Enchants", new String[]{"excellentenchants", "eenchants"})
+ .setConfigClass(Config.class)
+ .setLangClass(Lang.class)
+ .setPermissionsClass(Perms.class);
+ }
+
@Override
public void enable() {
if (!this.setNMS()) {
@@ -63,8 +62,15 @@ public class ExcellentEnchants extends NexPlugin {
return;
}
- this.tierManager = new TierManager(this);
- this.tierManager.setup();
+ Keys.loadKeys(this);
+ Config.loadRarityWeights(this.getConfig());
+
+ this.getLangManager().loadEnum(ItemCategory.class);
+ this.getLangManager().loadEnum(EnchantmentTarget.class);
+ this.getLangManager().loadEnum(DistributionWay.class);
+ this.getLangManager().loadEnum(Rarity.class);
+
+ this.registerCommands();
this.registry.setup();
@@ -72,14 +78,18 @@ public class ExcellentEnchants extends NexPlugin {
this.enchantManager.setup();
if (Config.ENCHANTMENTS_DISPLAY_MODE.get() == 2) {
- if (EngineUtils.hasPlugin(HookId.PROTOCOL_LIB)) {
- ProtocolHook.setup();
+ if (Plugins.isInstalled(HookId.PROTOCOL_LIB)) {
+ ProtocolHook.setup(this);
}
else {
- this.warn(HookId.PROTOCOL_LIB + " is not installed. Set display mode to Plain lore.");
+ this.warn(HookId.PROTOCOL_LIB + " is not installed. Display mode is set to Plain lore.");
Config.ENCHANTMENTS_DISPLAY_MODE.set(1);
}
}
+
+ if (Plugins.hasPlaceholderAPI()) {
+ PlaceholderHook.setup(this);
+ }
}
@Override
@@ -88,19 +98,16 @@ public class ExcellentEnchants extends NexPlugin {
this.enchantManager.shutdown();
this.enchantManager = null;
}
- if (this.tierManager != null) {
- this.tierManager.shutdown();
- this.tierManager = null;
- }
- if (EngineUtils.hasPlaceholderAPI()) {
+
+ if (Plugins.hasPlaceholderAPI()) {
PlaceholderHook.shutdown();
}
+
this.registry.shutdown();
}
private boolean setNMS() {
this.enchantNMS = switch (Version.getCurrent()) {
- case V1_18_R2 -> new V1_18_R2();
case V1_19_R3 -> new V1_19_R3();
case V1_20_R1 -> new V1_20_R1();
case V1_20_R2 -> new V1_20_R2();
@@ -110,49 +117,27 @@ public class ExcellentEnchants extends NexPlugin {
return this.enchantNMS != null;
}
- @Override
- public void loadConfig() {
- this.getConfig().initializeOptions(Config.class);
- }
-
- @Override
- public void loadLang() {
- this.getLangManager().loadMissing(Lang.class);
- this.getLangManager().loadEnum(ItemCategory.class);
- this.getLangManager().loadEnum(EnchantmentTarget.class);
- this.getLangManager().loadEnum(ObtainType.class);
- this.getLang().saveChanges();
- }
-
- @Override
- public void registerCommands(@NotNull GeneralCommand mainCommand) {
+ private void registerCommands() {
+ NightPluginCommand mainCommand = this.getBaseCommand();
mainCommand.addChildren(new BookCommand(this));
mainCommand.addChildren(new EnchantCommand(this));
mainCommand.addChildren(new ListCommand(this));
- mainCommand.addChildren(new TierbookCommand(this));
- mainCommand.addChildren(new ReloadSubCommand<>(this, Perms.COMMAND_RELOAD));
- }
-
- @Override
- public void registerHooks() {
- if (EngineUtils.hasPlaceholderAPI()) {
- PlaceholderHook.setup(this);
- }
- }
-
- @Override
- public void registerPermissions() {
- this.registerPermissions(Perms.class);
+ mainCommand.addChildren(new RarityBookCommand(this));
+ mainCommand.addChildren(new ReloadSubCommand(this, Perms.COMMAND_RELOAD));
}
@NotNull
- public EnchantPopulator createPopulator(@NotNull ItemStack item, @NotNull ObtainType obtainType) {
- return new EnchantPopulator(this, item, obtainType);
+ public EnchantPopulator createPopulator(@NotNull ItemStack item, @NotNull DistributionWay distributionWay) {
+ return new EnchantPopulator(this, item, distributionWay);
}
- @NotNull
- public TierManager getTierManager() {
- return tierManager;
+ public void populateResource(@NotNull BlockDropItemEvent event, @NotNull ItemStack itemStack) {
+ /*if (Plugins.isSpigot()) {
+ this.warn("Adding items to BlockDropItemEvent is not supported in Spigot, please use Paper or its forks for this feature.");
+ return;
+ }*/
+ Item item = this.getEnchantNMS().popResource(event.getBlock(), itemStack);
+ event.getItems().add(item);
}
@NotNull
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/Perms.java b/Core/src/main/java/su/nightexpress/excellentenchants/Perms.java
index 88045d3..f11ffe2 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/Perms.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/Perms.java
@@ -1,25 +1,31 @@
package su.nightexpress.excellentenchants;
import org.bukkit.permissions.PermissionDefault;
-import su.nexmedia.engine.api.server.JPermission;
+import su.nightexpress.nightcore.util.wrapper.UniPermission;
public class Perms {
- private static final String PREFIX = "excellentenchants.";
+ private static final String PREFIX = "excellentenchants.";
private static final String PREFIX_COMMAND = PREFIX + "command.";
- public static final JPermission PLUGIN = new JPermission(PREFIX + Placeholders.WILDCARD, "Access to all the plugin functions.");
- public static final JPermission COMMAND = new JPermission(PREFIX_COMMAND + Placeholders.WILDCARD, "Access to all the plugin commands.");
+ public static final UniPermission PLUGIN = new UniPermission(PREFIX + Placeholders.WILDCARD, "Access to all the plugin functions.");
+ public static final UniPermission COMMAND = new UniPermission(PREFIX_COMMAND + Placeholders.WILDCARD, "Access to all the plugin commands.");
- public static final JPermission COMMAND_BOOK = new JPermission(PREFIX_COMMAND + "book", "Allows to use '/eenchants book' command.");
- public static final JPermission COMMAND_ENCHANT = new JPermission(PREFIX_COMMAND + "enchant", "Allows to use '/eenchants enchant' command.");
- public static final JPermission COMMAND_LIST = new JPermission(PREFIX_COMMAND + "list", "Allows to use '/eenchants list' command.", PermissionDefault.TRUE);
- public static final JPermission COMMAND_TIERBOOK = new JPermission(PREFIX_COMMAND + "tierbook", "Allows to use '/eenchants tierbook' command.");
- public static final JPermission COMMAND_RELOAD = new JPermission(PREFIX_COMMAND + "reload", "Allows to use '/eenchants reload' command.");
+ public static final UniPermission COMMAND_BOOK = new UniPermission(PREFIX_COMMAND + "book");
+ public static final UniPermission COMMAND_ENCHANT = new UniPermission(PREFIX_COMMAND + "enchant");
+ public static final UniPermission COMMAND_LIST = new UniPermission(PREFIX_COMMAND + "list", "Allows to use '/eenchants list' command.", PermissionDefault.TRUE);
+ public static final UniPermission COMMAND_RARITY_BOOK = new UniPermission(PREFIX_COMMAND + "raritybook");
+ public static final UniPermission COMMAND_RELOAD = new UniPermission(PREFIX_COMMAND + "reload");
static {
PLUGIN.addChildren(COMMAND);
- COMMAND.addChildren(COMMAND_BOOK, COMMAND_ENCHANT, COMMAND_LIST, COMMAND_RELOAD, COMMAND_TIERBOOK);
+ COMMAND.addChildren(
+ COMMAND_BOOK,
+ COMMAND_ENCHANT,
+ COMMAND_LIST,
+ COMMAND_RELOAD,
+ COMMAND_RARITY_BOOK
+ );
}
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/Placeholders.java b/Core/src/main/java/su/nightexpress/excellentenchants/Placeholders.java
index 03b4bc5..e07c99e 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/Placeholders.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/Placeholders.java
@@ -1,54 +1,56 @@
-/*
- * Decompiled with CFR 0.151.
- *
- * Could not load the following classes:
- * su.nexmedia.engine.utils.Placeholders
- */
package su.nightexpress.excellentenchants;
-public class Placeholders
-extends su.nexmedia.engine.utils.Placeholders {
- public static final String URL_WIKI = "https://github.com/nulli0n/ExcellentEnchants-spigot/wiki/";
+public class Placeholders extends su.nightexpress.nightcore.util.Placeholders {
+
+ public static final String URL_WIKI = "https://github.com/nulli0n/ExcellentEnchants-spigot/wiki/";
public static final String URL_PLACEHOLDERS = "https://github.com/nulli0n/ExcellentEnchants-spigot/wiki/Internal-Placeholders";
- public static final String URL_ENGINE_SCALER = "https://github.com/nulli0n/NexEngine-spigot/wiki/Configuration-Tips#scalable-sections";
- public static final String URL_ENGINE_ITEMS = "https://github.com/nulli0n/NexEngine-spigot/wiki/Configuration-Tips#item-sections";
- public static final String GENERIC_TYPE = "%type%";
- public static final String GENERIC_NAME = "%name%";
- public static final String GENERIC_ITEM = "%item%";
- public static final String GENERIC_LEVEL = "%level%";
- public static final String GENERIC_AMOUNT = "%amount%";
+ public static final String URL_CHRAGES = "https://github.com/nulli0n/ExcellentEnchants-spigot/wiki/Charges-System";
+
+ public static final String VANILLA_DISTRIBUTION_NAME = "Vanilla Distribution Mode";
+ public static final String CUSTOM_DISTRIBUTION_NAME = "Custom Distribution Mode";
+
+ public static final String VANILLA_DISTRIBUTION_HEADER = "=".repeat(15) + " " + VANILLA_DISTRIBUTION_NAME + " " + "=".repeat(15);
+ public static final String CUSTOM_DISTRIBUTION_HEADER = "=".repeat(15) + " " + CUSTOM_DISTRIBUTION_NAME + " " + "=".repeat(15);
+
+ public static final String GENERIC_TYPE = "%type%";
+ public static final String GENERIC_NAME = "%name%";
+ public static final String GENERIC_ITEM = "%item%";
+ public static final String GENERIC_LEVEL = "%level%";
+ public static final String GENERIC_AMOUNT = "%amount%";
public static final String GENERIC_DESCRIPTION = "%description%";
- public static final String GENERIC_ENCHANT = "%enchant%";
- public static final String ENCHANTMENT_CHANCE = "%enchantment_trigger_chance%";
- public static final String ENCHANTMENT_INTERVAL = "%enchantment_trigger_interval%";
- public static final String ENCHANTMENT_POTION_LEVEL = "%enchantment_potion_level%";
- public static final String ENCHANTMENT_POTION_DURATION = "%enchantment_potion_duration%";
- public static final String ENCHANTMENT_POTION_TYPE = "%enchantment_potion_type%";
- public static final String ENCHANTMENT_ID = "%enchantment_id%";
- public static final String ENCHANTMENT_NAME = "%enchantment_name%";
- public static final String ENCHANTMENT_NAME_FORMATTED = "%enchantment_name_formatted%";
- public static final String ENCHANTMENT_DESCRIPTION = "%enchantment_description%";
- public static final String ENCHANTMENT_LEVEL = "%enchantment_level%";
- public static final String ENCHANTMENT_LEVEL_MIN = "%enchantment_level_min%";
- public static final String ENCHANTMENT_LEVEL_MAX = "%enchantment_level_max%";
- public static final String ENCHANTMENT_TIER = "%enchantment_tier%";
- public static final String ENCHANTMENT_TIER_COLOR = "%enchantment_tier_color%";
- public static final String ENCHANTMENT_FIT_ITEM_TYPES = "%enchantment_fit_item_types%";
- public static final String ENCHANTMENT_OBTAIN_CHANCE_ENCHANTING = "%enchantment_obtain_chance_enchanting%";
- public static final String ENCHANTMENT_OBTAIN_CHANCE_VILLAGER = "%enchantment_obtain_chance_villager%";
+ public static final String GENERIC_ENCHANT = "%enchant%";
+ public static final String GENERIC_RADIUS = "%radius%";
+ public static final String GENERIC_DURATION = "%duration%";
+ public static final String GENERIC_DAMAGE = "%damage%";
+ public static final String GENERIC_MIN = "%min%";
+ public static final String GENERIC_MAX = "%max%";
+ public static final String GENERIC_TIME = "%time%";
+
+ public static final String ENCHANTMENT_CHANCE = "%enchantment_trigger_chance%";
+ public static final String ENCHANTMENT_INTERVAL = "%enchantment_trigger_interval%";
+ public static final String ENCHANTMENT_POTION_LEVEL = "%enchantment_potion_level%";
+ public static final String ENCHANTMENT_POTION_DURATION = "%enchantment_potion_duration%";
+ public static final String ENCHANTMENT_POTION_TYPE = "%enchantment_potion_type%";
+ public static final String ENCHANTMENT_ID = "%enchantment_id%";
+ public static final String ENCHANTMENT_NAME = "%enchantment_name%";
+ public static final String ENCHANTMENT_NAME_FORMATTED = "%enchantment_name_formatted%";
+ public static final String ENCHANTMENT_DESCRIPTION = "%enchantment_description%";
+ public static final String ENCHANTMENT_DESCRIPTION_FORMATTED = "%enchantment_description_formatted%";
+ public static final String ENCHANTMENT_DESCRIPTION_REPLACED = "%enchantment_description_replaced%";
+ public static final String ENCHANTMENT_LEVEL = "%enchantment_level%";
+ public static final String ENCHANTMENT_LEVEL_MIN = "%enchantment_level_min%";
+ public static final String ENCHANTMENT_LEVEL_MAX = "%enchantment_level_max%";
+ public static final String ENCHANTMENT_RARITY = "%enchantment_rarity%";
+ public static final String ENCHANTMENT_FIT_ITEM_TYPES = "%enchantment_fit_item_types%";
+ public static final String ENCHANTMENT_OBTAIN_CHANCE_ENCHANTING = "%enchantment_obtain_chance_enchanting%";
+ public static final String ENCHANTMENT_OBTAIN_CHANCE_VILLAGER = "%enchantment_obtain_chance_villager%";
public static final String ENCHANTMENT_OBTAIN_CHANCE_LOOT_GENERATION = "%enchantment_obtain_chance_loot_generation%";
- public static final String ENCHANTMENT_OBTAIN_CHANCE_FISHING = "%enchantment_obtain_chance_fishing%";
- public static final String ENCHANTMENT_OBTAIN_CHANCE_MOB_SPAWNING = "%enchantment_obtain_chance_mob_spawning%";
- public static final String ENCHANTMENT_CHARGES_MAX_AMOUNT = "%enchantment_charges_max_amount%";
- public static final String ENCHANTMENT_CHARGES_CONSUME_AMOUNT = "%enchantment_charges_consume_amount%";
- public static final String ENCHANTMENT_CHARGES_RECHARGE_AMOUNT = "%enchantment_charges_recharge_amount%";
- public static final String ENCHANTMENT_CHARGES_FUEL_ITEM = "%enchantment_charges_fuel_item%";
- public static final String TIER_ID = "%tier_id%";
- public static final String TIER_NAME = "%tier_name%";
- public static final String TIER_OBTAIN_CHANCE_ENCHANTING = "%tier_obtain_chance_enchanting%";
- public static final String TIER_OBTAIN_CHANCE_VILLAGER = "%tier_obtain_chance_villager%";
- public static final String TIER_OBTAIN_CHANCE_LOOT_GENERATION = "%tier_obtain_chance_loot_generation%";
- public static final String TIER_OBTAIN_CHANCE_FISHING = "%tier_obtain_chance_fishing%";
- public static final String TIER_OBTAIN_CHANCE_MOB_SPAWNING = "%tier_obtain_chance_mob_spawning%";
+ public static final String ENCHANTMENT_OBTAIN_CHANCE_FISHING = "%enchantment_obtain_chance_fishing%";
+ public static final String ENCHANTMENT_OBTAIN_CHANCE_MOB_SPAWNING = "%enchantment_obtain_chance_mob_spawning%";
+ public static final String ENCHANTMENT_CHARGES = "%enchantment_charges%";
+ public static final String ENCHANTMENT_CHARGES_MAX_AMOUNT = "%enchantment_charges_max_amount%";
+ public static final String ENCHANTMENT_CHARGES_CONSUME_AMOUNT = "%enchantment_charges_consume_amount%";
+ public static final String ENCHANTMENT_CHARGES_RECHARGE_AMOUNT = "%enchantment_charges_recharge_amount%";
+ public static final String ENCHANTMENT_CHARGES_FUEL_ITEM = "%enchantment_charges_fuel_item%";
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Cleanable.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Cleanable.java
deleted file mode 100644
index 4cc9d59..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/Cleanable.java
+++ /dev/null
@@ -1,6 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment;
-
-public interface Cleanable {
-
- void clear();
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java
deleted file mode 100644
index df57cb2..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/IEnchantment.java
+++ /dev/null
@@ -1,83 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment;
-
-import org.bukkit.Keyed;
-import org.bukkit.enchantments.Enchantment;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import org.jetbrains.annotations.Nullable;
-import su.nexmedia.engine.api.config.JYML;
-import su.nightexpress.excellentenchants.enchantment.type.ObtainType;
-import su.nightexpress.excellentenchants.tier.Tier;
-
-import java.util.List;
-import java.util.Set;
-
-public interface IEnchantment extends Keyed {
-
- boolean isAvailableToUse(@NotNull LivingEntity entity);
-
- @NotNull JYML getConfig();
-
- @NotNull String getId();
-
- @NotNull String getDisplayName();
-
- @NotNull String getNameFormatted(int level);
-
- @NotNull String getNameFormatted(int level, int charges);
-
- @NotNull List getDescription();
-
- @NotNull List getDescription(int level);
-
- @NotNull Set getConflicts();
-
- @NotNull Tier getTier();
-
- int getMaxLevel();
-
- int getStartLevel();
-
- int getLevelByEnchantCost(int expLevel);
-
- double getObtainChance(@NotNull ObtainType obtainType);
-
- int getObtainLevelMin(@NotNull ObtainType obtainType);
-
- int getObtainLevelMax(@NotNull ObtainType obtainType);
-
- int generateLevel(@NotNull ObtainType obtainType);
-
- int getAnvilMergeCost(int level);
-
- boolean conflictsWith(@NotNull Enchantment enchantment);
-
- boolean canEnchantItem(@Nullable ItemStack item);
-
- boolean isCursed();
-
- boolean isTreasure();
-
- boolean isChargesEnabled();
-
- int getChargesMax(int level);
-
- int getChargesConsumeAmount(int level);
-
- int getChargesRechargeAmount(int level);
-
- @NotNull ItemStack getChargesFuel();
-
- boolean isChargesFuel(@NotNull ItemStack item);
-
- int getCharges(@NotNull ItemStack item);
-
- boolean isFullOfCharges(@NotNull ItemStack item);
-
- boolean isOutOfCharges(@NotNull ItemStack item);
-
- void consumeCharges(@NotNull ItemStack item, int level);
-
- void consumeChargesNoUpdate(@NotNull ItemStack item, int level);
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Arrowed.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Arrowed.java
deleted file mode 100644
index d9ff04b..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Arrowed.java
+++ /dev/null
@@ -1,29 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment.meta;
-
-import org.bukkit.entity.Projectile;
-import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.utils.values.UniParticle;
-
-import java.util.Optional;
-
-public interface Arrowed {
-
- @NotNull Arrowed getArrowImplementation();
-
- @NotNull
- default Optional getTrailParticle() {
- return this.getArrowImplementation().getTrailParticle();
- }
-
- default void addTrail(@NotNull Projectile projectile) {
- this.getArrowImplementation().addTrail(projectile);
- }
-
- default void addData(@NotNull Projectile projectile) {
- this.getArrowImplementation().addData(projectile);
- }
-
- default boolean isOurProjectile(@NotNull Projectile projectile) {
- return this.getArrowImplementation().isOurProjectile(projectile);
- }
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Periodic.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Periodic.java
deleted file mode 100644
index f2194ce..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Periodic.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment.meta;
-
-import org.jetbrains.annotations.NotNull;
-
-public interface Periodic {
-
- @NotNull Periodic getPeriodImplementation();
-
- default long getInterval() {
- return this.getPeriodImplementation().getInterval();
- }
-
- default long getNextTriggerTime() {
- return this.getPeriodImplementation().getNextTriggerTime();
- }
-
- default boolean isTriggerTime() {
- return this.getPeriodImplementation().isTriggerTime();
- }
-
- default void updateTriggerTime() {
- this.getPeriodImplementation().updateTriggerTime();
- }
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Potioned.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Potioned.java
deleted file mode 100644
index 246074a..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/meta/Potioned.java
+++ /dev/null
@@ -1,35 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment.meta;
-
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.potion.PotionEffect;
-import org.bukkit.potion.PotionEffectType;
-import org.jetbrains.annotations.NotNull;
-
-public interface Potioned {
-
- @NotNull Potioned getPotionImplementation();
-
- default boolean isPermanent() {
- return this.getPotionImplementation().isPermanent();
- }
-
- default PotionEffectType getEffectType() {
- return this.getPotionImplementation().getEffectType();
- }
-
- default int getEffectAmplifier(int level) {
- return this.getPotionImplementation().getEffectAmplifier(level);
- }
-
- default int getEffectDuration(int level) {
- return this.getPotionImplementation().getEffectDuration(level);
- }
-
- default PotionEffect createEffect(int level) {
- return this.getPotionImplementation().createEffect(level);
- }
-
- default boolean addEffect(@NotNull LivingEntity target, int level) {
- return this.getPotionImplementation().addEffect(target, level);
- }
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java b/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java
deleted file mode 100644
index f7aa000..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/api/enchantment/type/GenericEnchant.java
+++ /dev/null
@@ -1,7 +0,0 @@
-package su.nightexpress.excellentenchants.api.enchantment.type;
-
-import su.nightexpress.excellentenchants.api.enchantment.IEnchantment;
-
-public interface GenericEnchant extends IEnchantment {
-
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/BookCommand.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/BookCommand.java
index a63f2f2..daa3ca4 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/command/BookCommand.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/BookCommand.java
@@ -1,42 +1,41 @@
package su.nightexpress.excellentenchants.command;
import org.bukkit.Material;
-import org.bukkit.NamespacedKey;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.command.AbstractCommand;
-import su.nexmedia.engine.api.command.CommandResult;
-import su.nexmedia.engine.utils.CollectionsUtil;
-import su.nexmedia.engine.utils.PlayerUtil;
-import su.nexmedia.engine.utils.random.Rnd;
-import su.nightexpress.excellentenchants.ExcellentEnchants;
+import su.nightexpress.excellentenchants.ExcellentEnchantsPlugin;
import su.nightexpress.excellentenchants.Perms;
import su.nightexpress.excellentenchants.Placeholders;
import su.nightexpress.excellentenchants.config.Lang;
import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils;
+import su.nightexpress.nightcore.command.CommandResult;
+import su.nightexpress.nightcore.command.impl.AbstractCommand;
+import su.nightexpress.nightcore.util.BukkitThing;
+import su.nightexpress.nightcore.util.Players;
+import su.nightexpress.nightcore.util.random.Rnd;
import java.util.Arrays;
import java.util.List;
-public class BookCommand extends AbstractCommand {
+public class BookCommand extends AbstractCommand {
- public BookCommand(@NotNull ExcellentEnchants plugin) {
+ public BookCommand(@NotNull ExcellentEnchantsPlugin plugin) {
super(plugin, new String[]{"book"}, Perms.COMMAND_BOOK);
- this.setDescription(plugin.getMessage(Lang.COMMAND_BOOK_DESC));
- this.setUsage(plugin.getMessage(Lang.COMMAND_BOOK_USAGE));
+ this.setDescription(Lang.COMMAND_BOOK_DESC);
+ this.setUsage(Lang.COMMAND_BOOK_USAGE);
}
@Override
@NotNull
public List getTab(@NotNull Player player, int arg, @NotNull String[] args) {
if (arg == 1) {
- return CollectionsUtil.playerNames(player);
+ return Players.playerNames(player);
}
if (arg == 2) {
- return Arrays.stream(Enchantment.values()).map(e -> e.getKey().getKey()).toList();
+ return BukkitThing.getEnchantments().stream().map(enchantment -> enchantment.getKey().getKey()).toList();
}
if (arg == 3) {
return Arrays.asList("-1", "1", "5", "10");
@@ -47,19 +46,19 @@ public class BookCommand extends AbstractCommand {
@Override
protected void onExecute(@NotNull CommandSender sender, @NotNull CommandResult result) {
if (result.length() < 4) {
- this.printUsage(sender);
+ this.errorUsage(sender);
return;
}
- Player player = PlayerUtil.getPlayer(result.getArg(1));
+ Player player = Players.getPlayer(result.getArg(1));
if (player == null) {
this.errorPlayer(sender);
return;
}
- Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(result.getArg(2).toLowerCase()));
+ Enchantment enchantment = BukkitThing.getEnchantment(result.getArg(2));
if (enchantment == null) {
- plugin.getMessage(Lang.ERROR_NO_ENCHANT).send(sender);
+ Lang.ERROR_NO_ENCHANT.getMessage().send(sender);
return;
}
@@ -71,9 +70,9 @@ public class BookCommand extends AbstractCommand {
ItemStack item = new ItemStack(Material.ENCHANTED_BOOK);
EnchantUtils.add(item, enchantment, level, true);
EnchantUtils.updateDisplay(item);
- PlayerUtil.addItem(player, item);
+ Players.addItem(player, item);
- plugin.getMessage(Lang.COMMAND_BOOK_DONE)
+ Lang.COMMAND_BOOK_DONE.getMessage()
.replace(Placeholders.GENERIC_ENCHANT, EnchantUtils.getLocalized(enchantment))
.replace(Placeholders.forPlayer(player))
.send(sender);
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/EnchantCommand.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/EnchantCommand.java
index 9d59d76..8665f44 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/command/EnchantCommand.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/EnchantCommand.java
@@ -1,47 +1,46 @@
package su.nightexpress.excellentenchants.command;
-import org.bukkit.NamespacedKey;
import org.bukkit.command.CommandSender;
import org.bukkit.enchantments.Enchantment;
import org.bukkit.entity.Player;
import org.bukkit.inventory.EquipmentSlot;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.command.AbstractCommand;
-import su.nexmedia.engine.api.command.CommandResult;
-import su.nexmedia.engine.utils.*;
-import su.nexmedia.engine.utils.random.Rnd;
-import su.nightexpress.excellentenchants.ExcellentEnchants;
+import su.nightexpress.excellentenchants.ExcellentEnchantsPlugin;
import su.nightexpress.excellentenchants.Perms;
import su.nightexpress.excellentenchants.Placeholders;
import su.nightexpress.excellentenchants.config.Lang;
import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils;
+import su.nightexpress.nightcore.command.CommandResult;
+import su.nightexpress.nightcore.command.impl.AbstractCommand;
+import su.nightexpress.nightcore.util.*;
+import su.nightexpress.nightcore.util.random.Rnd;
import java.util.Arrays;
import java.util.List;
-public class EnchantCommand extends AbstractCommand {
+public class EnchantCommand extends AbstractCommand {
- public EnchantCommand(@NotNull ExcellentEnchants plugin) {
+ public EnchantCommand(@NotNull ExcellentEnchantsPlugin plugin) {
super(plugin, new String[]{"enchant"}, Perms.COMMAND_ENCHANT);
- this.setDescription(plugin.getMessage(Lang.COMMAND_ENCHANT_DESC));
- this.setUsage(plugin.getMessage(Lang.COMMAND_ENCHANT_USAGE));
+ this.setDescription(Lang.COMMAND_ENCHANT_DESC);
+ this.setUsage(Lang.COMMAND_ENCHANT_USAGE);
}
@Override
@NotNull
public List getTab(@NotNull Player player, int arg, @NotNull String[] args) {
if (arg == 1) {
- return Arrays.stream(Enchantment.values()).map(e -> e.getKey().getKey()).toList();
+ return BukkitThing.getEnchantments().stream().map(enchantment -> enchantment.getKey().getKey()).toList();
}
if (arg == 2) {
return Arrays.asList("-1", "1", "5", "10");
}
if (arg == 3) {
- return CollectionsUtil.playerNames(player);
+ return Players.playerNames(player);
}
if (arg == 4) {
- return CollectionsUtil.getEnumsList(EquipmentSlot.class);
+ return Lists.getEnums(EquipmentSlot.class);
}
return super.getTab(player, arg, args);
}
@@ -49,17 +48,17 @@ public class EnchantCommand extends AbstractCommand {
@Override
protected void onExecute(@NotNull CommandSender sender, @NotNull CommandResult result) {
if (result.length() < 3) {
- this.printUsage(sender);
+ this.errorUsage(sender);
return;
}
- Enchantment enchantment = Enchantment.getByKey(NamespacedKey.minecraft(result.getArg(1).toLowerCase()));
+ Enchantment enchantment = BukkitThing.getEnchantment(result.getArg(1));
if (enchantment == null) {
- plugin.getMessage(Lang.ERROR_NO_ENCHANT).send(sender);
+ Lang.ERROR_NO_ENCHANT.getMessage().send(sender);
return;
}
- Player player = PlayerUtil.getPlayer(result.getArg(3, sender.getName()));
+ Player player = Players.getPlayer(result.getArg(3, sender.getName()));
if (player == null) {
this.errorPlayer(sender);
return;
@@ -69,7 +68,7 @@ public class EnchantCommand extends AbstractCommand {
ItemStack item = player.getInventory().getItem(slot);
if (item == null || item.getType().isAir()) {
- this.plugin.getMessage(Lang.COMMAND_ENCHANT_ERROR_NO_ITEM).send(sender);
+ Lang.COMMAND_ENCHANT_ERROR_NO_ITEM.getMessage().send(sender);
return;
}
@@ -86,7 +85,7 @@ public class EnchantCommand extends AbstractCommand {
EnchantUtils.updateDisplay(item);
player.getInventory().setItem(slot, item);
- plugin.getMessage(sender == player ? Lang.COMMAND_ENCHANT_DONE_SELF : Lang.COMMAND_ENCHANT_DONE_OTHERS)
+ (sender == player ? Lang.COMMAND_ENCHANT_DONE_SELF : Lang.COMMAND_ENCHANT_DONE_OTHERS).getMessage()
.replace(Placeholders.forPlayer(player))
.replace(Placeholders.GENERIC_ITEM, ItemUtil.getItemName(item))
.replace(Placeholders.GENERIC_ENCHANT, EnchantUtils.getLocalized(enchantment))
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/ListCommand.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/ListCommand.java
index cb1dcdb..51981bc 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/command/ListCommand.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/ListCommand.java
@@ -3,22 +3,22 @@ package su.nightexpress.excellentenchants.command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.command.AbstractCommand;
-import su.nexmedia.engine.api.command.CommandResult;
-import su.nightexpress.excellentenchants.ExcellentEnchants;
+import su.nightexpress.excellentenchants.ExcellentEnchantsPlugin;
import su.nightexpress.excellentenchants.Perms;
import su.nightexpress.excellentenchants.config.Lang;
+import su.nightexpress.nightcore.command.CommandResult;
+import su.nightexpress.nightcore.command.impl.AbstractCommand;
-public class ListCommand extends AbstractCommand {
+public class ListCommand extends AbstractCommand {
- public ListCommand(@NotNull ExcellentEnchants plugin) {
+ public ListCommand(@NotNull ExcellentEnchantsPlugin plugin) {
super(plugin, new String[]{"list"}, Perms.COMMAND_LIST);
- this.setDescription(plugin.getMessage(Lang.COMMAND_LIST_DESC));
+ this.setDescription(Lang.COMMAND_LIST_DESC);
this.setPlayerOnly(true);
}
@Override
protected void onExecute(@NotNull CommandSender sender, @NotNull CommandResult result) {
- plugin.getEnchantManager().getEnchantsListGUI().open((Player) sender, 1);
+ plugin.getEnchantManager().openEnchantsMenu((Player) sender);
}
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/RarityBookCommand.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/RarityBookCommand.java
new file mode 100644
index 0000000..7e2267f
--- /dev/null
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/command/RarityBookCommand.java
@@ -0,0 +1,91 @@
+package su.nightexpress.excellentenchants.command;
+
+import org.bukkit.Material;
+import org.bukkit.command.CommandSender;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import su.nightexpress.excellentenchants.ExcellentEnchantsPlugin;
+import su.nightexpress.excellentenchants.Perms;
+import su.nightexpress.excellentenchants.Placeholders;
+import su.nightexpress.excellentenchants.api.enchantment.EnchantmentData;
+import su.nightexpress.excellentenchants.api.enchantment.Rarity;
+import su.nightexpress.excellentenchants.config.Lang;
+import su.nightexpress.excellentenchants.enchantment.registry.EnchantRegistry;
+import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils;
+import su.nightexpress.nightcore.command.CommandResult;
+import su.nightexpress.nightcore.command.impl.AbstractCommand;
+import su.nightexpress.nightcore.util.Lists;
+import su.nightexpress.nightcore.util.Players;
+import su.nightexpress.nightcore.util.StringUtil;
+import su.nightexpress.nightcore.util.random.Rnd;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+public class RarityBookCommand extends AbstractCommand {
+
+ public RarityBookCommand(@NotNull ExcellentEnchantsPlugin plugin) {
+ super(plugin, new String[]{"raritybook"}, Perms.COMMAND_RARITY_BOOK);
+ this.setDescription(Lang.COMMAND_RARITY_BOOK_DESC);
+ this.setUsage(Lang.COMMAND_RARITY_BOOK_USAGE);
+ }
+
+ @Override
+ @NotNull
+ public List getTab(@NotNull Player player, int arg, @NotNull String[] args) {
+ if (arg == 1) {
+ return Players.playerNames(player);
+ }
+ if (arg == 2) {
+ return Lists.getEnums(Rarity.class);
+ }
+ if (arg == 3) {
+ return Arrays.asList("-1", "1", "5", "10");
+ }
+ return super.getTab(player, arg, args);
+ }
+
+ @Override
+ protected void onExecute(@NotNull CommandSender sender, @NotNull CommandResult result) {
+ if (result.length() < 4) {
+ this.errorUsage(sender);
+ return;
+ }
+
+ Player player = Players.getPlayer(result.getArg(1));
+ if (player == null) {
+ this.errorPlayer(sender);
+ return;
+ }
+
+ Rarity rarity = StringUtil.getEnum(result.getArg(2), Rarity.class).orElse(null);
+ if (rarity == null) {
+ Lang.ERROR_INVALID_RARITY.getMessage().send(sender);
+ return;
+ }
+
+ Set enchants = EnchantRegistry.getByRarity(rarity);
+ EnchantmentData enchantmentData = enchants.isEmpty() ? null : Rnd.get(enchants);
+ if (enchantmentData == null) {
+ Lang.ERROR_NO_ENCHANT.getMessage().send(sender);
+ return;
+ }
+
+ int level = result.getInt(3, -1);
+ if (level < 1) {
+ level = Rnd.get(enchantmentData.getMinLevel(), enchantmentData.getMaxLevel());
+ }
+
+ ItemStack item = new ItemStack(Material.ENCHANTED_BOOK);
+ EnchantUtils.add(item, enchantmentData.getEnchantment(), level, true);
+ EnchantUtils.updateDisplay(item);
+ Players.addItem(player, item);
+
+ Lang.COMMAND_RARITY_BOOK_DONE.getMessage()
+ .replace(Placeholders.GENERIC_NAME, plugin.getLangManager().getEnum(rarity))
+ .replace(Placeholders.forPlayer(player))
+ .send(sender);
+ }
+}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/command/TierbookCommand.java b/Core/src/main/java/su/nightexpress/excellentenchants/command/TierbookCommand.java
deleted file mode 100644
index f1813ac..0000000
--- a/Core/src/main/java/su/nightexpress/excellentenchants/command/TierbookCommand.java
+++ /dev/null
@@ -1,90 +0,0 @@
-package su.nightexpress.excellentenchants.command;
-
-import org.bukkit.Material;
-import org.bukkit.command.CommandSender;
-import org.bukkit.entity.Player;
-import org.bukkit.inventory.ItemStack;
-import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.command.AbstractCommand;
-import su.nexmedia.engine.api.command.CommandResult;
-import su.nexmedia.engine.utils.CollectionsUtil;
-import su.nexmedia.engine.utils.Placeholders;
-import su.nexmedia.engine.utils.PlayerUtil;
-import su.nexmedia.engine.utils.random.Rnd;
-import su.nightexpress.excellentenchants.ExcellentEnchants;
-import su.nightexpress.excellentenchants.Perms;
-import su.nightexpress.excellentenchants.config.Lang;
-import su.nightexpress.excellentenchants.enchantment.impl.ExcellentEnchant;
-import su.nightexpress.excellentenchants.enchantment.registry.EnchantRegistry;
-import su.nightexpress.excellentenchants.enchantment.util.EnchantUtils;
-import su.nightexpress.excellentenchants.tier.Tier;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Set;
-
-public class TierbookCommand extends AbstractCommand {
-
- public TierbookCommand(@NotNull ExcellentEnchants plugin) {
- super(plugin, new String[]{"tierbook"}, Perms.COMMAND_TIERBOOK);
- this.setDescription(plugin.getMessage(Lang.COMMAND_TIER_BOOK_DESC));
- this.setUsage(plugin.getMessage(Lang.COMMAND_TIER_BOOK_USAGE));
- }
-
- @Override
- @NotNull
- public List getTab(@NotNull Player player, int arg, @NotNull String[] args) {
- if (arg == 1) {
- return CollectionsUtil.playerNames(player);
- }
- if (arg == 2) {
- return plugin.getTierManager().getTierIds();
- }
- if (arg == 3) {
- return Arrays.asList("-1", "1", "5", "10");
- }
- return super.getTab(player, arg, args);
- }
-
- @Override
- protected void onExecute(@NotNull CommandSender sender, @NotNull CommandResult result) {
- if (result.length() < 4) {
- this.printUsage(sender);
- return;
- }
-
- Player player = PlayerUtil.getPlayer(result.getArg(1));
- if (player == null) {
- this.errorPlayer(sender);
- return;
- }
-
- Tier tier = plugin.getTierManager().getTierById(result.getArg(2).toLowerCase());
- if (tier == null) {
- plugin.getMessage(Lang.COMMAND_TIER_BOOK_ERROR).send(sender);
- return;
- }
-
- Set enchants = EnchantRegistry.getOfTier(tier);
- ExcellentEnchant enchant = enchants.isEmpty() ? null : Rnd.get(enchants);
- if (enchant == null) {
- plugin.getMessage(Lang.ERROR_NO_ENCHANT).send(sender);
- return;
- }
-
- int level = result.getInt(3, -1);
- if (level < 1) {
- level = Rnd.get(enchant.getStartLevel(), enchant.getMaxLevel());
- }
-
- ItemStack item = new ItemStack(Material.ENCHANTED_BOOK);
- EnchantUtils.add(item, enchant.getBackend(), level, true);
- EnchantUtils.updateDisplay(item);
- PlayerUtil.addItem(player, item);
-
- plugin.getMessage(Lang.COMMAND_TIER_BOOK_DONE)
- .replace(tier.replacePlaceholders())
- .replace(Placeholders.forPlayer(player))
- .send(sender);
- }
-}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java b/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java
index fa89bde..e4c897e 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java
@@ -3,166 +3,255 @@ package su.nightexpress.excellentenchants.config;
import org.bukkit.Material;
import org.bukkit.inventory.ItemStack;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.api.config.JOption;
-import su.nexmedia.engine.api.config.JYML;
-import su.nexmedia.engine.utils.Colorizer;
-import su.nexmedia.engine.utils.Colors2;
-import su.nexmedia.engine.utils.StringUtil;
-import su.nightexpress.excellentenchants.Placeholders;
-import su.nightexpress.excellentenchants.api.enchantment.ObtainType;
-import su.nightexpress.excellentenchants.tier.Tier;
+import su.nightexpress.excellentenchants.api.DistributionMode;
+import su.nightexpress.excellentenchants.api.DistributionWay;
+import su.nightexpress.excellentenchants.api.enchantment.Rarity;
+import su.nightexpress.excellentenchants.hook.HookId;
+import su.nightexpress.nightcore.config.ConfigValue;
+import su.nightexpress.nightcore.config.FileConfig;
+import su.nightexpress.nightcore.util.NumberUtil;
+import su.nightexpress.nightcore.util.StringUtil;
+import su.nightexpress.nightcore.util.wrapper.UniInt;
import java.util.*;
import java.util.stream.Collectors;
-import java.util.stream.Stream;
+
+import static su.nightexpress.excellentenchants.Placeholders.*;
+import static su.nightexpress.nightcore.util.text.tag.Tags.*;
public class Config {
public static final String DIR_MENU = "/menu/";
+ public static final String DIR_ENCHANTS = "/enchants/";
- public static final JOption TASKS_ARROW_TRAIL_TICKS_INTERVAL = JOption.create("Tasks.Arrow_Trail.Tick_Interval",
+ public static final ConfigValue CORE_PROJECTILE_PARTICLE_INTERVAL = ConfigValue.create("Core.Projectile_Particles_Tick_Interval",
1L,
- "Sets how often (in ticks) arrow trail particle effects will be spawned behind the arrow."
+ "Sets how often (in ticks) enchantment particle effects will be spawned behind projectiles.",
+ "[Increase for performance; Decrease for better visuals]",
+ "[20 ticks = 1 second]",
+ "[Default is 1]"
);
- public static final JOption TASKS_PASSIVE_ENCHANTS_TRIGGER_INTERVAL = JOption.create("Tasks.Passive_Enchants.Trigger_Interval",
+ public static final ConfigValue CORE_PASSIVE_ENCHANTS_TRIGGER_INTERVAL = ConfigValue.create("Core.Passive_Enchants_Trigger_Interval",
100L,
- "Sets how often (in ticks) the plugin will attempt to trigger passive enchantment effects on all alive entities.",
- "For best results it's recommened to keep this value smaller, but at the same rate as enchantment 'Trigger_Interval' settings.",
- "Examples:",
- "--- Global: 100 ticks; Regrowth: 100 ticks; Saturation: 100 ticks;",
- "--- Global: 50 ticks, Regrowth: 100 ticks; Saturation: 150 ticks;"
+ "Sets how often (in ticks) passive enchantment effects will trigger on all alive and loaded entities.",
+ "For best results it's recommened to keep this value lower, but at the same rate as enchantment's 'Trigger_Interval' option.",
+ "=".repeat(15) + " EXAMPLES " + "=".repeat(15),
+ "==> Global (this): 100 ticks; Regrowth: 200 ticks; Saturation: 300 ticks;",
+ "==> Global (this): 50 ticks, Regrowth: 100 ticks; Saturation: 150 ticks;",
+ "[Increase for performance; Decrease for more smooth effect]",
+ "[20 ticks = 1 second]",
+ "[Default is 100]"
);
- public static final JOption ENCHANTMENTS_INTERNAL_HANDLER = JOption.create("Enchantments.Internal_Distributor", false,
- "[EXPERIMENTAL - DO NOT TOUCH]",
- "Sets whether or not enchantment distribution will be handled by vanilla server mechanics.");
+ public static final ConfigValue CORE_PASSIVE_ENCHANTS_FOR_MOBS = ConfigValue.create("Core.Apply_Passive_Enchants_To_Mobs",
+ true,
+ "Sets whether or not mobs can have passive enchantment effects (such as permanent potion effects, regeneration, etc.).",
+ "[Enable for enhanced gameplay; Disable for performance]",
+ "[Default is true]"
+ );
- public static final JOption ENCHANTMENTS_CHARGES_ENABLED = JOption.create("Enchantments.Charges.Enabled",
+ public static final ConfigValue CORE_SWORD_ENCHANTS_TO_AXES = ConfigValue.create("Core.Sword_Enchants_To_Axes",
+ true,
+ "Sets whether or not Sword enchantments can be applied on Axes.",
+ "[Default is true]"
+ );
+
+ public static final ConfigValue CORE_BOW_ENCHANTS_TO_CROSSBOW = ConfigValue.create("Core.Bow_Enchants_To_Crossbows",
+ true,
+ "Sets whether or not Bow enchantments can be applied on Crossbows.",
+ "[Default is true]"
+ );
+
+ public static final ConfigValue CORE_CHESTPLATE_ENCHANTS_TO_ELYTRA = ConfigValue.create("Core.Chestplate_Enchants_To_Elytra",
false,
- "Enables the enchantment Charges feature.",
- Placeholders.URL_WIKI + "Charges-System");
+ "Sets whether or not Chestplate enchantments can be applied on Elytras.",
+ "[Default is false]"
+ );
- public static final JOption> ENCHANTMENTS_CHARGES_FORMAT = new JOption>("Enchantments.Charges.Format",
- (cfg, path, def) -> {
- TreeMap map = new TreeMap<>();
- for (String raw : cfg.getSection(path)) {
- int percent = StringUtil.getInteger(raw, -1);
- if (percent < 0) continue;
- String format = Colorizer.apply(cfg.getString(path + "." + raw, ""));
- if (format.isEmpty()) continue;
- map.put(percent, format);
- }
- return map;
- },
+ public static final ConfigValue> ENCHANTMENTS_DISABLED_LIST = ConfigValue.forSet("Enchantments.Disabled.List",
+ String::toLowerCase,
+ FileConfig::set,
+ Set.of("example_name", "custom_sharpness"),
+ "Put here CUSTOM enchantment names that you want to disable and remove completely.",
+ "Enchantment names are equal to their config file names in '" + DIR_ENCHANTS + "' folder.",
+ "[*] You MUST REBOOT your server for disabled enchantments to have effect.",
+ "[*] Once enchantment is disabled, it will be removed from all items in the world on next load!"
+ );
+
+ public static final ConfigValue