diff --git a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java index 74df866..c3aa678 100644 --- a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java +++ b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java @@ -118,6 +118,10 @@ public final class WrappedVillager { return dataContainer.has(Keys.LAST_RESTOCK.key(), PersistentDataType.LONG) ? dataContainer.get(Keys.LAST_RESTOCK.key(), PersistentDataType.LONG) : 0L; } + public long getRestockCooldownMillis(final long cooldown_millis) { + return dataContainer.has(Keys.LAST_RESTOCK.key(), PersistentDataType.LONG) ? (villager.getWorld().getFullTime() - (dataContainer.get(Keys.LAST_RESTOCK.key(), PersistentDataType.LONG) + cooldown_millis)) : cooldown_millis; + } + /** * @return The level between 1-5 calculated from the villagers experience. */ @@ -157,6 +161,6 @@ public final class WrappedVillager { } public long getLevelCooldownMillis(final long cooldown_millis) { - return dataContainer.has(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) ? (villager.getWorld().getFullTime() - (dataContainer.get(Keys.LAST_OPTIMIZE.key(), PersistentDataType.LONG) + cooldown_millis)) : cooldown_millis; + return dataContainer.has(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) ? (villager.getWorld().getFullTime() - (dataContainer.get(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) + cooldown_millis)) : cooldown_millis; } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java index 74383ba..c5c3f99 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/BlockOptimization.java @@ -110,9 +110,9 @@ public class BlockOptimization implements VillagerOptimizerModule, Listener { wVillager.villager().shakeHead(); if (shouldNotifyPlayer) { Player player = event.getPlayer(); - final long optimizeCoolDown = wVillager.getOptimizeCooldownMillis(cooldown); + final String timeLeft = CommonUtils.formatTime(wVillager.getOptimizeCooldownMillis(cooldown)); VillagerOptimizer.getLang(player.locale()).block_on_optimize_cooldown.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(CommonUtils.formatTime(optimizeCoolDown)).build()))); + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()))); } } } @@ -178,9 +178,9 @@ public class BlockOptimization implements VillagerOptimizerModule, Listener { wVillager.villager().shakeHead(); if (shouldNotifyPlayer) { Player player = event.getPlayer(); - final long optimizeCoolDown = wVillager.getOptimizeCooldownMillis(cooldown); + final String timeLeft = CommonUtils.formatTime(wVillager.getOptimizeCooldownMillis(cooldown)); VillagerOptimizer.getLang(player.locale()).block_on_optimize_cooldown.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(CommonUtils.formatTime(optimizeCoolDown)).build())) + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())) ); } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java index 6533dc4..2d7071d 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java @@ -3,7 +3,6 @@ package me.xginko.villageroptimizer.modules; import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.cache.VillagerManager; import me.xginko.villageroptimizer.config.Config; -import me.xginko.villageroptimizer.enums.OptimizationType; import me.xginko.villageroptimizer.models.WrappedVillager; import me.xginko.villageroptimizer.utils.CommonUtils; import net.kyori.adventure.text.TextReplacementConfig; @@ -69,10 +68,9 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { && wVillager.calculateLevel() > villager.getVillagerLevel() ) { villager.addPotionEffect(new PotionEffect(PotionEffectType.SLOW, (int) (20 + (cooldown / 50L)), 120, false, false)); - final OptimizationType previousOptimization = wVillager.getOptimizationType(); - wVillager.setOptimization(OptimizationType.OFF); + villager.setAware(true); villager.getScheduler().runDelayed(plugin, reOptimize -> { - wVillager.setOptimization(previousOptimization); + villager.setAware(false); wVillager.saveLastLevelUp(); }, null, 100L); } @@ -82,11 +80,14 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { @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(); - String timeLeft = CommonUtils.formatTime(wVillager.getLevelCooldownMillis(cooldown)); + 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/java/me/xginko/villageroptimizer/modules/RestockTrades.java b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java index 45cf587..451346c 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java @@ -62,8 +62,9 @@ public class RestockTrades implements VillagerOptimizerModule, Listener { wVillager.saveRestockTime(); if (notifyPlayer) { Player player = event.getPlayer(); + final String timeLeft = CommonUtils.formatTime(wVillager.getRestockCooldownMillis(restock_delay_millis)); VillagerOptimizer.getLang(player.locale()).trades_restocked.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(CommonUtils.formatTime(restock_delay_millis)).build())) + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build())) ); } if (shouldLog) diff --git a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java index 14217c9..e470b4f 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java @@ -121,9 +121,9 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene closestOptimizableVillager.villager().shakeHead(); if (shouldNotifyPlayer) { Player player = event.getPlayer(); - final long optimizeCoolDown = closestOptimizableVillager.getOptimizeCooldownMillis(cooldown); + final String timeLeft = CommonUtils.formatTime(closestOptimizableVillager.getOptimizeCooldownMillis(cooldown)); VillagerOptimizer.getLang(player.locale()).nametag_on_optimize_cooldown.forEach(line -> player.sendMessage(line - .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(CommonUtils.formatTime(optimizeCoolDown)).build()) + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(timeLeft).build()) )); } }