diff --git a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java index 8d45ede..de80b16 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java @@ -6,7 +6,6 @@ import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.models.WrappedVillager; import me.xginko.villageroptimizer.utils.CommonUtils; import net.kyori.adventure.text.TextReplacementConfig; -import org.bukkit.entity.EntityType; import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; @@ -15,7 +14,6 @@ import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryType; -import org.bukkit.event.player.PlayerInteractEntityEvent; import org.bukkit.potion.PotionEffect; import org.bukkit.potion.PotionEffectType; @@ -23,6 +21,7 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { private final VillagerOptimizer plugin; private final VillagerManager villagerManager; + private final boolean shouldNotify; private final long cooldown; public LevelVillagers() { @@ -34,9 +33,11 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { Temporarily enables the villagers AI to allow it to level up and then disables it again. """); this.cooldown = config.getInt("optimization.villager-leveling.level-check-cooldown-seconds", 5, """ - Cooldown in seconds the level of a villager will be checked and updated again. \s + Cooldown in seconds until the level of a villager will be checked and updated again. \s Recommended to leave as is. """) * 1000L; + this.shouldNotify = config.getBoolean("optimization.villager-leveling.notify-player", true, + "Tell players to wait when a villager is leveling up."); } @Override @@ -62,35 +63,27 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { && event.getInventory().getHolder() instanceof Villager villager ) { WrappedVillager wVillager = villagerManager.getOrAdd(villager); - if ( - wVillager.isOptimized() - && wVillager.canLevelUp(cooldown) - && wVillager.calculateLevel() > villager.getVillagerLevel() - ) { - villager.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, (int) (20 + (cooldown / 50L)), 120, false, false)); - villager.getScheduler().run(VillagerOptimizer.getInstance(), enableAI -> villager.setAware(true), null); - villager.getScheduler().runDelayed(plugin, disableAI -> { - villager.setAware(false); - wVillager.saveLastLevelUp(); - }, null, 100L); + if (!wVillager.isOptimized()) return; + + if (wVillager.canLevelUp(cooldown)) { + if (wVillager.calculateLevel() > villager.getVillagerLevel()) { + villager.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, (int) (20 + (cooldown / 50L)), 120, false, false)); + villager.getScheduler().run(plugin, enableAI -> villager.setAware(true), null); + villager.getScheduler().runDelayed(plugin, disableAI -> { + villager.setAware(false); + wVillager.saveLastLevelUp(); + }, null, 100L); + } + } else { + wVillager.villager().shakeHead(); + if (shouldNotify) { + Player player = (Player) event.getPlayer(); + final String timeLeft = CommonUtils.formatTime(wVillager.getLevelCooldownMillis(cooldown)); + VillagerOptimizer.getLang(player.locale()).villager_leveling_up.forEach(line -> player.sendMessage(line + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()) + )); + } } } } - - @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - private void onInteract(PlayerInteractEntityEvent event) { - if (!event.getRightClicked().getType().equals(EntityType.VILLAGER)) return; - - WrappedVillager wVillager = villagerManager.getOrAdd((Villager) event.getRightClicked()); - - if (wVillager.isOptimized() && !wVillager.canLevelUp(cooldown)) { - event.setCancelled(true); - wVillager.villager().shakeHead(); - Player player = event.getPlayer(); - final String timeLeft = CommonUtils.formatTime(wVillager.getLevelCooldownMillis(cooldown)); - VillagerOptimizer.getLang(player.locale()).villager_leveling_up.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()) - )); - } - } } diff --git a/src/main/resources/plugin.yml b/src/main/resources/plugin.yml index 6b5333d..309f08f 100644 --- a/src/main/resources/plugin.yml +++ b/src/main/resources/plugin.yml @@ -1,5 +1,27 @@ name: VillagerOptimizer version: '${project.version}' main: me.xginko.villageroptimizer.VillagerOptimizer +authors: [ xGinko ] +description: ${project.description} +website: ${project.url} api-version: '1.19' -folia-supported: true \ No newline at end of file +folia-supported: true +commands: + villageroptimizer: + usage: /villageroptimizer [ reload, version ] + description: VillagerOptimizer admin commands + optimizevillagers: + usage: /optimizevillagers + description: Optmize villagers in a radius around you + unoptmizevillagers: + usage: /unoptimizevillagers + description: Unoptmize villagers in a radius around you +permissions: + villageroptimizer.*: + description: Admin plugin permissions + children: + villageroptimizer.cmd.reload: true + villageroptimizer.cmd.version: true + villageroptimizer.cmd.optimize: true + villageroptimizer.cmd.unoptimize: true + villageroptimizer.cooldownbypass: true \ No newline at end of file