diff --git a/Core/pom.xml b/Core/pom.xml
index f0b2304..0d3e595 100644
--- a/Core/pom.xml
+++ b/Core/pom.xml
@@ -35,6 +35,10 @@
false
+
+ placeholderapi
+ https://repo.extendedclip.com/content/repositories/placeholderapi/
+
@@ -90,6 +94,12 @@
ProtocolLib
5.0.0-SNAPSHOT
+
+ me.clip
+ placeholderapi
+ 2.11.2
+ provided
+
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java
index c3839ce..139ff70 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/ExcellentEnchants.java
@@ -15,6 +15,7 @@ import su.nightexpress.excellentenchants.config.Lang;
import su.nightexpress.excellentenchants.enchantment.EnchantManager;
import su.nightexpress.excellentenchants.enchantment.type.FitItemType;
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_17_R1.V1_17_R1;
@@ -62,6 +63,7 @@ public class ExcellentEnchants extends NexPlugin {
this.tierManager.shutdown();
this.tierManager = null;
}
+ PlaceholderHook.shutdown();
}
private boolean setNMS() {
@@ -106,6 +108,9 @@ public class ExcellentEnchants extends NexPlugin {
Config.ENCHANTMENTS_DISPLAY_MODE.set(1);
}
}
+ if (Hooks.hasPlaceholderAPI()) {
+ PlaceholderHook.setup();
+ }
}
@Override
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 4e2b866..04c1e4d 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/config/Config.java
@@ -5,6 +5,7 @@ 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.StringUtil;
import su.nightexpress.excellentenchants.Placeholders;
import su.nightexpress.excellentenchants.enchantment.type.ObtainType;
@@ -30,7 +31,7 @@ public class Config {
Placeholders.URL_WIKI + "Charges-System");
public static final JOption> ENCHANTMENTS_CHARGES_FORMAT = new JOption>("Enchantments.Charges.Format",
- (cfg, path, def) -> cfg.getSection(path).stream().collect(Collectors.toMap(k -> StringUtil.getDouble(k, 0), v -> StringUtil.color(cfg.getString(path + "." + v, "")), (o,n) -> n, TreeMap::new)),
+ (cfg, path, def) -> cfg.getSection(path).stream().collect(Collectors.toMap(k -> StringUtil.getDouble(k, 0), v -> Colorizer.apply(cfg.getString(path + "." + v, "")), (o,n) -> n, TreeMap::new)),
() -> {
TreeMap map = new TreeMap<>();
map.put(0D, "#ff9a9a(" + Placeholders.GENERIC_AMOUNT + "⚡)");
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantManager.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantManager.java
index b37052d..b907e47 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantManager.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/EnchantManager.java
@@ -208,7 +208,7 @@ public class EnchantManager extends AbstractManager {
Map enchants = EnchantManager.getExcellentEnchantments(item);
int sizeHas = PDCUtil.getInt(item, KEY_LORE_SIZE).orElse(0);
- int sizeReal = enchants.size() + enchants.keySet().stream().map(ExcellentEnchant::getDescription).mapToInt(List::size).sum();
+ int sizeReal = enchants.size();
ItemMeta meta = item.getItemMeta();
if (meta == null) return false;
@@ -219,9 +219,12 @@ public class EnchantManager extends AbstractManager {
}
if (!meta.hasItemFlag(ItemFlag.HIDE_ENCHANTS)) {
- enchants.forEach((enchant, level) -> {
- lore.addAll(0, enchant.formatDescription(level));
- });
+ if (Config.ENCHANTMENTS_DESCRIPTION_ENABLED.get()) {
+ enchants.forEach((enchant, level) -> {
+ lore.addAll(0, enchant.formatDescription(level));
+ });
+ sizeReal += enchants.keySet().stream().map(ExcellentEnchant::getDescription).mapToInt(List::size).sum();
+ }
enchants.forEach((enchant, level) -> {
lore.add(0, enchant.getNameFormatted(level, getEnchantmentCharges(meta, enchant)));
});
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java
index 6a4c363..dba573b 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/armor/EnchantRegrowth.java
@@ -13,15 +13,17 @@ import su.nexmedia.engine.utils.EntityUtil;
import su.nexmedia.engine.utils.NumberUtil;
import su.nightexpress.excellentenchants.ExcellentEnchants;
import su.nightexpress.excellentenchants.api.enchantment.ExcellentEnchant;
+import su.nightexpress.excellentenchants.api.enchantment.meta.Chanced;
import su.nightexpress.excellentenchants.api.enchantment.type.PassiveEnchant;
import su.nightexpress.excellentenchants.api.enchantment.util.EnchantPriority;
import su.nightexpress.excellentenchants.enchantment.EnchantManager;
import su.nightexpress.excellentenchants.enchantment.config.EnchantScaler;
+import su.nightexpress.excellentenchants.enchantment.impl.meta.ChanceImplementation;
import su.nightexpress.excellentenchants.enchantment.task.AbstractEnchantmentTask;
import java.util.function.UnaryOperator;
-public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant, ICleanable {
+public class EnchantRegrowth extends ExcellentEnchant implements Chanced, PassiveEnchant, ICleanable {
public static final String ID = "regrowth";
@@ -35,6 +37,7 @@ public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant,
private EnchantScaler healMaxHealth;
private EnchantScaler healAmount;
+ private ChanceImplementation chanceImplementation;
private Task task;
public EnchantRegrowth(@NotNull ExcellentEnchants plugin) {
@@ -45,6 +48,7 @@ public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant,
@Override
public void loadConfig() {
super.loadConfig();
+ this.chanceImplementation = ChanceImplementation.create(this);
this.healInterval = JOption.create("Settings.Heal.Interval", 100,
"How often (in ticks) enchantment will have effect? 1 second = 20 ticks.").read(cfg);
this.healMinHealth = EnchantScaler.read(this, "Settings.Heal.Min_Health", "0.5",
@@ -81,6 +85,12 @@ public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant,
;
}
+ @NotNull
+ @Override
+ public ChanceImplementation getChanceImplementation() {
+ return chanceImplementation;
+ }
+
@NotNull
@Override
public EnchantmentTarget getItemTarget() {
@@ -106,6 +116,7 @@ public class EnchantRegrowth extends ExcellentEnchant implements PassiveEnchant,
@Override
public boolean onTrigger(@NotNull LivingEntity entity, @NotNull ItemStack item, int level) {
if (!this.isAvailableToUse(entity)) return false;
+ if (!this.checkTriggerChance(level)) return false;
double healthMax = EntityUtil.getAttribute(entity, Attribute.GENERIC_MAX_HEALTH);
double healthHas = entity.getHealth();
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantConfusingArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantConfusingArrows.java
index e11203a..eeebde6 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantConfusingArrows.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantConfusingArrows.java
@@ -1,6 +1,7 @@
package su.nightexpress.excellentenchants.enchantment.impl.bow;
import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
@@ -61,6 +62,7 @@ public class EnchantConfusingArrows extends PotionEnchant implements Chanced, Ar
if (!(e.getProjectile() instanceof Arrow arrow)) return false;
if (!this.checkTriggerChance(level)) return false;
+ arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
return arrow.addCustomEffect(this.createEffect(level), true);
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java
index cfbdd90..bd26d58 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantElectrifiedArrows.java
@@ -4,6 +4,7 @@ import org.bukkit.Particle;
import org.bukkit.block.Block;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.Item;
+import org.bukkit.entity.ItemFrame;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
import org.bukkit.event.EventHandler;
@@ -100,9 +101,9 @@ public class EnchantElectrifiedArrows extends ExcellentEnchant implements Chance
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onItemDamage(EntityDamageByEntityEvent e) {
if (!e.getDamager().hasMetadata(META_NO_ITEM_DAMAGE)) return;
- if (!(e.getEntity() instanceof Item item)) return;
-
- e.setCancelled(true);
- item.setFireTicks(0);
+ if (e.getEntity() instanceof Item || e.getEntity() instanceof ItemFrame) {
+ e.setCancelled(true);
+ e.getEntity().setFireTicks(0);
+ }
}
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantExplosiveArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantExplosiveArrows.java
index f7673a7..9686a5d 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantExplosiveArrows.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantExplosiveArrows.java
@@ -2,10 +2,7 @@ package su.nightexpress.excellentenchants.enchantment.impl.bow;
import org.bukkit.World;
import org.bukkit.enchantments.EnchantmentTarget;
-import org.bukkit.entity.Entity;
-import org.bukkit.entity.Item;
-import org.bukkit.entity.LivingEntity;
-import org.bukkit.entity.Projectile;
+import org.bukkit.entity.*;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
@@ -138,8 +135,9 @@ public class EnchantExplosiveArrows extends ExcellentEnchant implements Chanced,
if (e.getCause() != EntityDamageEvent.DamageCause.ENTITY_EXPLOSION) return;
if (this.explosionDamageItems) return;
if (!e.getDamager().hasMetadata(META_EXPLOSION_SOURCE)) return;
- if (!(e.getEntity() instanceof Item item)) return;
- e.setCancelled(true);
+ if (e.getEntity() instanceof Item || e.getEntity() instanceof ItemFrame) {
+ e.setCancelled(true);
+ }
}
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantHover.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantHover.java
index 405d206..76e187d 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantHover.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantHover.java
@@ -1,6 +1,7 @@
package su.nightexpress.excellentenchants.enchantment.impl.bow;
import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
@@ -61,6 +62,7 @@ public class EnchantHover extends PotionEnchant implements Chanced, Arrowed, Bow
if (!(e.getProjectile() instanceof Arrow arrow)) return false;
if (!this.checkTriggerChance(level)) return false;
+ arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
return arrow.addCustomEffect(this.createEffect(level), true);
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantPoisonedArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantPoisonedArrows.java
index 7764532..e05ca02 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantPoisonedArrows.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantPoisonedArrows.java
@@ -1,6 +1,7 @@
package su.nightexpress.excellentenchants.enchantment.impl.bow;
import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
@@ -61,6 +62,7 @@ public class EnchantPoisonedArrows extends PotionEnchant implements Chanced, Arr
if (!(e.getProjectile() instanceof Arrow arrow)) return false;
if (!this.checkTriggerChance(level)) return false;
+ arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
return arrow.addCustomEffect(this.createEffect(level), true);
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantWitheredArrows.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantWitheredArrows.java
index 5614164..9f8eca4 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantWitheredArrows.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/bow/EnchantWitheredArrows.java
@@ -1,6 +1,7 @@
package su.nightexpress.excellentenchants.enchantment.impl.bow;
import org.bukkit.enchantments.EnchantmentTarget;
+import org.bukkit.entity.AbstractArrow;
import org.bukkit.entity.Arrow;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Projectile;
@@ -61,6 +62,7 @@ public class EnchantWitheredArrows extends PotionEnchant implements Chanced, Arr
if (!(e.getProjectile() instanceof Arrow arrow)) return false;
if (!this.checkTriggerChance(level)) return false;
+ arrow.setPickupStatus(AbstractArrow.PickupStatus.DISALLOWED);
return arrow.addCustomEffect(this.createEffect(level), true);
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java
index 24e327d..5a28bbd 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantDecapitator.java
@@ -2,18 +2,27 @@ package su.nightexpress.excellentenchants.enchantment.impl.weapon;
import org.bukkit.Material;
+import org.bukkit.NamespacedKey;
import org.bukkit.Particle;
+import org.bukkit.block.Skull;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.EntityType;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
+import org.bukkit.event.EventHandler;
+import org.bukkit.event.EventPriority;
+import org.bukkit.event.block.BlockDropItemEvent;
+import org.bukkit.event.block.BlockPlaceEvent;
import org.bukkit.event.entity.EntityDeathEvent;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.SkullMeta;
import org.jetbrains.annotations.NotNull;
import su.nexmedia.engine.api.config.JOption;
+import su.nexmedia.engine.lang.LangManager;
import su.nexmedia.engine.utils.EffectUtil;
import su.nexmedia.engine.utils.ItemUtil;
+import su.nexmedia.engine.utils.PDCUtil;
+import su.nexmedia.engine.utils.StringUtil;
import su.nightexpress.excellentenchants.ExcellentEnchants;
import su.nightexpress.excellentenchants.Placeholders;
import su.nightexpress.excellentenchants.api.enchantment.ExcellentEnchant;
@@ -37,8 +46,11 @@ public class EnchantDecapitator extends ExcellentEnchant implements Chanced, Dea
private Map headTextures;
private ChanceImplementation chanceImplementation;
+ private final NamespacedKey skullKey;
+
public EnchantDecapitator(@NotNull ExcellentEnchants plugin) {
super(plugin, ID, EnchantPriority.MEDIUM);
+ this.skullKey = new NamespacedKey(plugin, this.getId() + ".entity_type");
}
@Override
@@ -132,6 +144,7 @@ public class EnchantDecapitator extends ExcellentEnchant implements Chanced, Dea
meta.setDisplayName(entityName);
item.setItemMeta(meta);
}
+ PDCUtil.set(item, this.skullKey, entityType.name());
entity.getWorld().dropItemNaturally(entity.getLocation(), item);
@@ -140,4 +153,41 @@ public class EnchantDecapitator extends ExcellentEnchant implements Chanced, Dea
}
return true;
}
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+ public void onBlockPlace(BlockPlaceEvent e) {
+ if (!(e.getBlock().getState() instanceof Skull skull)) return;
+
+ ItemStack skullItem = e.getItemInHand();
+ PDCUtil.getString(skullItem, this.skullKey).ifPresent(type -> {
+ PDCUtil.set(skull, this.skullKey, type);
+ skull.update(true);
+ });
+ }
+
+ @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
+ public void onBlockPlace(BlockDropItemEvent e) {
+ if (!(e.getBlockState() instanceof Skull skull)) return;
+
+ PDCUtil.getString(skull, this.skullKey).ifPresent(type -> {
+ String texture = this.headTextures.get(type);
+ if (texture == null) return;
+
+ EntityType entityType = StringUtil.getEnum(type, EntityType.class).orElse(null);
+ if (entityType == null) return;
+
+ e.getItems().forEach(item -> {
+ ItemStack drop = item.getItemStack();
+ if (drop.getType() == Material.PLAYER_HEAD) {
+ ItemUtil.setSkullTexture(drop, texture);
+ ItemUtil.mapMeta(drop, meta -> {
+ String name = this.headName.replace(Placeholders.GENERIC_TYPE, LangManager.getEntityType(entityType));
+ meta.setDisplayName(name);
+ PDCUtil.set(meta, this.skullKey, type);
+ });
+ }
+ item.setItemStack(drop);
+ });
+ });
+ }
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantSurprise.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantSurprise.java
index 1805410..9a4ef6c 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantSurprise.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/impl/weapon/EnchantSurprise.java
@@ -1,5 +1,6 @@
package su.nightexpress.excellentenchants.enchantment.impl.weapon;
+import org.bukkit.Color;
import org.bukkit.Particle;
import org.bukkit.enchantments.EnchantmentTarget;
import org.bukkit.entity.LivingEntity;
@@ -8,7 +9,7 @@ import org.bukkit.inventory.ItemStack;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.jetbrains.annotations.NotNull;
-import su.nexmedia.engine.utils.EffectUtil;
+import su.nexmedia.engine.api.particle.SimpleParticle;
import su.nexmedia.engine.utils.random.Rnd;
import su.nightexpress.excellentenchants.ExcellentEnchants;
import su.nightexpress.excellentenchants.api.enchantment.meta.Chanced;
@@ -54,7 +55,9 @@ public class EnchantSurprise extends PotionEnchant implements Chanced, CombatEnc
if (!victim.addPotionEffect(effect)) return false;
if (this.hasVisualEffects()) {
- EffectUtil.playEffect(victim.getEyeLocation(), Particle.SPELL_WITCH, "", 0.25, 0.25, 0.25, 0.1f, 30);
+ Color color = Color.fromRGB(Rnd.nextInt(256), Rnd.nextInt(256), Rnd.nextInt(256));
+ Particle.DustOptions dustOptions = new Particle.DustOptions(color, 2f);
+ SimpleParticle.of(Particle.REDSTONE, dustOptions).play(victim.getEyeLocation(), 0.25, 0.1, 25);
}
return true;
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java
index c8b6f14..07f13c5 100644
--- a/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/enchantment/listener/EnchantGenericListener.java
@@ -188,21 +188,24 @@ public class EnchantGenericListener extends AbstractListener
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
public void onEnchantPopulateSpawn(CreatureSpawnEvent e) {
- if (Config.getObtainSettings(ObtainType.MOB_SPAWNING).isEmpty()) return;
-
+ //if (Config.getObtainSettings(ObtainType.MOB_SPAWNING).isEmpty()) return;
LivingEntity entity = e.getEntity();
- if (Hooks.isMythicMob(entity)) return;
- EntityEquipment equipment = entity.getEquipment();
- if (equipment == null) return;
+ this.plugin.runTaskLater(task -> {
+ EntityEquipment equipment = entity.getEquipment();
+ if (equipment == null) return;
- for (EquipmentSlot slot : EquipmentSlot.values()) {
- ItemStack item = equipment.getItem(slot);
- if (EnchantManager.isEnchantable(item)) {
- EnchantManager.populateEnchantments(item, ObtainType.MOB_SPAWNING);
- EnchantManager.getExcellentEnchantments(item).keySet().forEach(enchant -> EnchantManager.restoreEnchantmentCharges(item, enchant));
- equipment.setItem(slot, item);
+ boolean isMythic = Hooks.isMythicMob(entity);
+ boolean doPopulation = Config.getObtainSettings(ObtainType.MOB_SPAWNING).isPresent() && !isMythic;
+
+ for (EquipmentSlot slot : EquipmentSlot.values()) {
+ ItemStack item = equipment.getItem(slot);
+ if (EnchantManager.isEnchantable(item)) {
+ if (doPopulation) EnchantManager.populateEnchantments(item, ObtainType.MOB_SPAWNING);
+ EnchantManager.getExcellentEnchantments(item).keySet().forEach(enchant -> EnchantManager.restoreEnchantmentCharges(item, enchant));
+ equipment.setItem(slot, item);
+ }
}
- }
+ }, 40L);
}
}
diff --git a/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PlaceholderHook.java b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PlaceholderHook.java
new file mode 100644
index 0000000..4421ea2
--- /dev/null
+++ b/Core/src/main/java/su/nightexpress/excellentenchants/hook/impl/PlaceholderHook.java
@@ -0,0 +1,85 @@
+package su.nightexpress.excellentenchants.hook.impl;
+
+import me.clip.placeholderapi.expansion.PlaceholderExpansion;
+import org.bukkit.NamespacedKey;
+import org.bukkit.entity.Player;
+import org.bukkit.inventory.EquipmentSlot;
+import org.bukkit.inventory.ItemStack;
+import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
+import su.nexmedia.engine.utils.StringUtil;
+import su.nightexpress.excellentenchants.ExcellentEnchantsAPI;
+import su.nightexpress.excellentenchants.api.enchantment.ExcellentEnchant;
+import su.nightexpress.excellentenchants.enchantment.EnchantRegister;
+
+public class PlaceholderHook {
+
+ private static EnchantsExpansion expansion;
+
+ public static void setup() {
+ if (expansion == null) {
+ expansion = new EnchantsExpansion();
+ expansion.register();
+ }
+ }
+
+ public static void shutdown() {
+ if (expansion != null) {
+ expansion.unregister();
+ expansion = null;
+ }
+ }
+
+ static class EnchantsExpansion extends PlaceholderExpansion {
+
+ @Override
+ @NotNull
+ public String getIdentifier() {
+ return "excellentenchants";
+ }
+
+ @Override
+ @NotNull
+ public String getAuthor() {
+ return ExcellentEnchantsAPI.PLUGIN.getDescription().getAuthors().get(0);
+ }
+
+ @Override
+ @NotNull
+ public String getVersion() {
+ return ExcellentEnchantsAPI.PLUGIN.getDescription().getVersion();
+ }
+
+ @Override
+ @Nullable
+ public String onPlaceholderRequest(Player player, @NotNull String params) {
+ if (params.startsWith("charges_remaining_")) {
+ String[] chargesSplit = params.substring("charges_remaining_".length()).split(":");
+ if (chargesSplit.length < 2) return null;
+
+ EquipmentSlot slot = StringUtil.getEnum(chargesSplit[0], EquipmentSlot.class).orElse(null);
+ if (slot == null) return null;
+
+ ItemStack item = player.getInventory().getItem(slot);
+ if (item == null || item.getType().isAir()) return "-";
+
+ ExcellentEnchant enchant = EnchantRegister.get(NamespacedKey.minecraft(chargesSplit[1].toLowerCase()));
+ if (enchant == null) return null;
+
+ return String.valueOf(enchant.getCharges(item));
+ }
+ if (params.startsWith("charges_maximum_")) {
+ String[] chargesSplit = params.substring("charges_maximum_".length()).split(":");
+ if (chargesSplit.length < 2) return null;
+
+ ExcellentEnchant enchant = EnchantRegister.get(NamespacedKey.minecraft(chargesSplit[0].toLowerCase()));
+ if (enchant == null) return null;
+
+ int level = StringUtil.getInteger(chargesSplit[1], 1);
+
+ return String.valueOf(enchant.getChargesMax(level));
+ }
+ return super.onPlaceholderRequest(player, params);
+ }
+ }
+}
diff --git a/Core/src/main/resources/lang/messages_pl.yml b/Core/src/main/resources/lang/messages_pl.yml
index 0470bfb..d70c887 100644
--- a/Core/src/main/resources/lang/messages_pl.yml
+++ b/Core/src/main/resources/lang/messages_pl.yml
@@ -1,18 +1,37 @@
-# Przetłumaczone przez nitolar play
-# Tłumaczenie utworzono: 06.11.2020
Command:
+ List:
+ Desc: Lista wszystkich customowych enchantów.
Enchant:
- Usage:
- Desc: Zaklnij przedmiot w swojej ręce.
- Done: '&aSukcesywnie Zaklnięto!'
+ Usage:
+ Desc: Zaklina przedmiot trzymany w łapce.
+ Done: '&aPomyślnie zaklęto!'
Book:
- Usage:
- Desc: Dodaje niestandardowo zaklniętą książke.
- Done: Dodano zaklniętą ksiązke z zaklęciem &6%enchant%&7 do gracza &6%player%&7.
+ Usage:
+ Desc: Daje książkę z customowym enchantem.
+ Done: Przyznano zaklętą książkę &6%enchant%&7 dla &6%player_display_name%&7.
TierBook:
- Usage: <żadkość>
- Desc: Dodaje zaklniętą książke.
- Error: '&cZły poziom żadkości!'
- Done: Dodano zaklniętą ksiązke z zaklęciem &6%enchant%&7 do gracza &6%player%&7.
+ Usage:
+ Desc: Daje książkę z enchantem.
+ Error: '&cZły poziom!'
+ Done: Przyznano zaklętą książkę &6%tier_name%&7 dla &6%player_display_name%&7.
Error:
- NoEnchant: '&cNie ma takiego zaklęcia.'
\ No newline at end of file
+ NoEnchant: '&cNiepoprawny enchant.'
+FitItemType:
+ HELMET: Hełm
+ CHESTPLATE: Napierśnik
+ LEGGINGS: Spodnie
+ BOOTS: Buty
+ ELYTRA: Elytra
+ WEAPON: Broń
+ TOOL: Narzędzie
+ ARMOR: Zbroja
+ UNIVERSAL: Uniwersalny
+ SWORD: Miecz
+ TRIDENT: Trójząb
+ AXE: Siekiera
+ BOW: Łuk
+ CROSSBOW: Kusza
+ HOE: Motyka
+ PICKAXE: Kilof
+ SHOVEL: Łopata
+ FISHING_ROD: Wędka
\ No newline at end of file
diff --git a/Core/src/main/resources/plugin.yml b/Core/src/main/resources/plugin.yml
index 9ab8ab6..d51072f 100644
--- a/Core/src/main/resources/plugin.yml
+++ b/Core/src/main/resources/plugin.yml
@@ -4,41 +4,6 @@ name: ExcellentEnchants
author: NightExpress
desciption: Vanilla-like enchants for your server.
depend: [ NexEngine ]
-softdepend: [ ProtocolLib, NoCheatPlus ]
+softdepend: [ ProtocolLib, NoCheatPlus, PlaceholderAPI ]
api-version: 1.17
-load: STARTUP
-
-permissions:
- excellentenchants.admin:
- description: Grants access to all plugin functions.
- default: op
- children:
- excellentenchants.user: true
- excellentenchants.command: true
-
- excellentenchants.user:
- description: Grants access to basic player plugin functions.
- default: true
-
- excellentenchants.command:
- description: Grants access to all the plugin commands.
- default: op
- children:
- excellentenchants.command.book: true
- excellentenchants.command.enchant: true
- excellentenchants.command.list: true
- excellentenchants.command.tierbook: true
-
- excellentenchants.command.book:
- description: Grants access to /eenchants book command.
- default: op
- excellentenchants.command.enchant:
- description: Grants access to /eenchants enchant command.
- default: op
- excellentenchants.command.list:
- description: Grants access to /eenchants list command.
- default: true
- excellentenchants.command.tierbook:
- description: Grants access to /eenchants tierbook command.
- default: op
-
+load: STARTUP
\ No newline at end of file