complete level logic

This commit is contained in:
xGinko 2023-09-10 02:04:07 +02:00
parent d7d16b0871
commit ff0ba445fd
3 changed files with 41 additions and 5 deletions

View File

@ -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. * @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) { 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() { public long getLastLevelUpTime() {
return dataContainer.has(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) ? dataContainer.get(Keys.LAST_LEVELUP.key(), PersistentDataType.LONG) : 0L; 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;
}
} }

View File

@ -3,7 +3,12 @@ package me.xginko.villageroptimizer.modules;
import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.cache.VillagerManager; import me.xginko.villageroptimizer.cache.VillagerManager;
import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.enums.OptimizationType;
import me.xginko.villageroptimizer.models.WrappedVillager; 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.entity.Villager;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -11,6 +16,9 @@ import org.bukkit.event.HandlerList;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.inventory.InventoryCloseEvent;
import org.bukkit.event.inventory.InventoryType; 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 { public class LevelVillagers implements VillagerOptimizerModule, Listener {
@ -55,9 +63,33 @@ public class LevelVillagers implements VillagerOptimizerModule, Listener {
&& event.getInventory().getHolder() instanceof Villager villager && event.getInventory().getHolder() instanceof Villager villager
) { ) {
WrappedVillager wVillager = villagerManager.getOrAdd(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())
));
} }
} }
} }

View File

@ -94,9 +94,9 @@ public class NametagOptimization implements VillagerOptimizerModule, Listener {
event.setCancelled(true); event.setCancelled(true);
wVillager.villager().shakeHead(); wVillager.villager().shakeHead();
if (shouldNotifyPlayer) { 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 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 { } else {