From ff0ba445fd4dc3b824666698debcc22c3319aeb6 Mon Sep 17 00:00:00 2001 From: xGinko Date: Sun, 10 Sep 2023 02:04:07 +0200 Subject: [PATCH] complete level logic --- .../models/WrappedVillager.java | 6 +++- .../modules/LevelVillagers.java | 36 +++++++++++++++++-- .../modules/NametagOptimization.java | 4 +-- 3 files changed, 41 insertions(+), 5 deletions(-) diff --git a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java index 7dccdcf..74df866 100644 --- a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java +++ b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java @@ -136,7 +136,7 @@ public final class WrappedVillager { * @return The system time in millis when the villager was last optimized, 0L if the villager was never optimized. */ public boolean canLevelUp(final long cooldown_millis) { - return dataContainer.has(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) && dataContainer.get(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) + cooldown_millis <= villager.getWorld().getFullTime(); + return getLastLevelUpTime() + cooldown_millis <= villager.getWorld().getFullTime(); } /** @@ -155,4 +155,8 @@ public final class WrappedVillager { public long getLastLevelUpTime() { return dataContainer.has(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) ? dataContainer.get(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) : 0L; } + + 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; + } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java index 97a52d6..6533dc4 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/LevelVillagers.java @@ -3,7 +3,12 @@ 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; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Player; import org.bukkit.entity.Villager; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -11,6 +16,9 @@ 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; public class LevelVillagers implements VillagerOptimizerModule, Listener { @@ -55,9 +63,33 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener { && event.getInventory().getHolder() instanceof Villager villager ) { WrappedVillager wVillager = villagerManager.getOrAdd(villager); - if (!wVillager.isOptimized()) return; + if ( + wVillager.isOptimized() + && wVillager.canLevelUp(cooldown) + && 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.getScheduler().runDelayed(plugin, reOptimize -> { + wVillager.setOptimization(previousOptimization); + wVillager.saveLastLevelUp(); + }, null, 100L); + } + } + } - // logic missing + @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); + Player player = event.getPlayer(); + 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/NametagOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java index 3163024..f292fb4 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/NametagOptimization.java @@ -94,9 +94,9 @@ public class NametagOptimization implements VillagerOptimizerModule, Listener { event.setCancelled(true); wVillager.villager().shakeHead(); if (shouldNotifyPlayer) { - final long optimizeCoolDown = wVillager.getOptimizeCooldownMillis(cooldown); + final String time = CommonUtils.formatTime(wVillager.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(time).build()))); } } } else {