From e089a416ea2758728543e58a2d35d7b080af9457 Mon Sep 17 00:00:00 2001 From: xGinko Date: Fri, 8 Sep 2023 22:00:22 +0200 Subject: [PATCH] finish trade restocker and issues --- .../villageroptimizer/config/Config.java | 8 ++---- .../config/LanguageCache.java | 4 ++- .../xginko/villageroptimizer/enums/Keys.java | 4 +-- .../models/WrappedVillager.java | 27 +++++++++++-------- .../modules/RestockTrades.java | 25 +++++++++++++---- .../villageroptimizer/utils/LogUtils.java | 2 +- src/main/resources/lang/en_us.yml | 2 ++ 7 files changed, 46 insertions(+), 26 deletions(-) diff --git a/src/main/java/me/xginko/villageroptimizer/config/Config.java b/src/main/java/me/xginko/villageroptimizer/config/Config.java index 6af82fb..5eeb08e 100644 --- a/src/main/java/me/xginko/villageroptimizer/config/Config.java +++ b/src/main/java/me/xginko/villageroptimizer/config/Config.java @@ -18,9 +18,7 @@ public class Config { public final Locale default_lang; public final boolean auto_lang, enable_nametag_optimization, enable_workstation_optimization, enable_block_optimization; - public final int state_change_cooldown; - public final double workstation_max_distance; - public final long cache_keep_time_seconds; + public final long cache_keep_time_seconds, optimize_cooldown_millis; public final HashSet nametags = new HashSet<>(4); public final HashSet blocks_that_disable = new HashSet<>(4); @@ -41,7 +39,7 @@ public class Config { /** * Optimization */ - this.state_change_cooldown = getInt("optimization.state-change-cooldown-in-seconds", 600); + this.optimize_cooldown_millis = getInt("optimization.state-change-cooldown-in-seconds", 600) * 1000L; // Nametags this.enable_nametag_optimization = getBoolean("optimization.methods.by-nametag.enable", true); this.nametags.addAll(getList("optimization.methods.by-nametag.names", List.of("Optimize", "DisableAI"), "Names are case insensitive") @@ -51,8 +49,6 @@ public class Config { Optimize villagers that are standing near their acquired workstations /s Values here need to be valid bukkit Material enums for your server version. """); - this.workstation_max_distance = getDouble("optimization.methods.by-workstation.disable-range-in-blocks", 4.0, - "How close in blocks a villager needs to be to get optimized by its workstation"); this.getList("optimization.methods.by-workstation.workstation-materials", List.of( "COMPOSTER", "SMOKER", "BARREL", "LOOM", "BLAST_FURNACE", "BREWING_STAND", "CAULDRON", "FLETCHING_TABLE", "CARTOGRAPHY_TABLE", "LECTERN", "SMITHING_TABLE", "STONECUTTER", "GRINDSTONE" diff --git a/src/main/java/me/xginko/villageroptimizer/config/LanguageCache.java b/src/main/java/me/xginko/villageroptimizer/config/LanguageCache.java index 3318b97..7a117ed 100644 --- a/src/main/java/me/xginko/villageroptimizer/config/LanguageCache.java +++ b/src/main/java/me/xginko/villageroptimizer/config/LanguageCache.java @@ -16,13 +16,15 @@ public class LanguageCache { public final Component no_permission; public final List nametag_optimize_success, nametag_on_optimize_cooldown, nametag_unoptimize_success, block_optimize_success, block_on_optimize_cooldown, block_unoptimize_success, - workstation_optimize_success, workstation_on_optimize_cooldown, workstation_unoptimize_success; + workstation_optimize_success, workstation_on_optimize_cooldown, workstation_unoptimize_success, + trades_restocked; public LanguageCache(String lang) throws Exception { this.lang = loadLang(new File(VillagerOptimizer.getInstance().getDataFolder() + File.separator + "lang", lang + ".yml")); this.miniMessage = MiniMessage.miniMessage(); this.no_permission = getTranslation("messages.no-permission", "You don't have permission to use this command."); + this.trades_restocked = getListTranslation("messages.restock-success", List.of("All trades restocked!")); this.nametag_optimize_success = getListTranslation("messages.nametag.optimize-success", List.of("Successfully optimized villager by using a nametag.")); this.nametag_on_optimize_cooldown = getListTranslation("messages.nametag.optimize-on-cooldown", List.of("You need to wait %time% until you can optimize this villager again.")); this.nametag_unoptimize_success = getListTranslation("messages.nametag.unoptimize-success", List.of("Successfully unoptimized villager by using a nametag.")); diff --git a/src/main/java/me/xginko/villageroptimizer/enums/Keys.java b/src/main/java/me/xginko/villageroptimizer/enums/Keys.java index 04a3672..f55af9b 100644 --- a/src/main/java/me/xginko/villageroptimizer/enums/Keys.java +++ b/src/main/java/me/xginko/villageroptimizer/enums/Keys.java @@ -6,9 +6,9 @@ import org.bukkit.NamespacedKey; public enum Keys { OPTIMIZED(VillagerOptimizer.getKey("optimized")), - COOLDOWN_OPTIMIZE(VillagerOptimizer.getKey("optimize-state-change-cooldown")), + COOLDOWN_OPTIMIZE(VillagerOptimizer.getKey("optimize-cooldown")), COOLDOWN_EXPERIENCE(VillagerOptimizer.getKey("experience-cooldown")), - WORLDTIME(VillagerOptimizer.getKey("world-time")); + WORLDTIME(VillagerOptimizer.getKey("last-restock-time")); private final NamespacedKey key; diff --git a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java index 195649a..fac6695 100644 --- a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java +++ b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java @@ -41,7 +41,7 @@ public final class WrappedVillager { if (isOnOptimizeCooldown()) return false; dataContainer.set(Keys.OPTIMIZED.key(), PersistentDataType.STRING, type.name()); villager.setAware(false); - setOptimizeCooldown(VillagerOptimizer.getConfiguration().state_change_cooldown); + setOptimizeCooldown(VillagerOptimizer.getConfiguration().optimize_cooldown_millis); } return true; } @@ -62,10 +62,6 @@ public final class WrappedVillager { return dataContainer.has(Keys.COOLDOWN_OPTIMIZE.key(), PersistentDataType.LONG) && dataContainer.get(Keys.COOLDOWN_OPTIMIZE.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); } - public void restock() { - villager.getRecipes().forEach(recipe -> recipe.setUses(0)); - } - public void setExpCooldown(long milliseconds) { dataContainer.set(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); } @@ -74,13 +70,22 @@ public final class WrappedVillager { return dataContainer.has(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) && dataContainer.get(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); } - public long saveWorldTime() { - final long worldTime = villager.getWorld().getFullTime(); - dataContainer.set(Keys.WORLDTIME.key(), PersistentDataType.LONG, worldTime); - return worldTime; + public boolean canRestock(final long cooldown_millis) { + final long lastRestock = getRestockTimestamp(); + if (lastRestock == 0L) return true; + return lastRestock + cooldown_millis <= villager.getWorld().getFullTime(); } - public long getSavedWorldTime() { - return dataContainer.has(Keys.WORLDTIME.key(), PersistentDataType.LONG) ? dataContainer.get(Keys.WORLDTIME.key(), PersistentDataType.LONG) : saveWorldTime(); + public void restock() { + villager.getRecipes().forEach(recipe -> recipe.setUses(0)); + saveRestockTimestamp(); + } + + public void saveRestockTimestamp() { + dataContainer.set(Keys.WORLDTIME.key(), PersistentDataType.LONG, villager.getWorld().getFullTime()); + } + + public long getRestockTimestamp() { + return dataContainer.has(Keys.WORLDTIME.key(), PersistentDataType.LONG) ? dataContainer.get(Keys.WORLDTIME.key(), PersistentDataType.LONG) : 0L; } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java index 5338e3d..23e52ed 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/RestockTrades.java @@ -1,10 +1,13 @@ package me.xginko.villageroptimizer.modules; import me.xginko.villageroptimizer.VillagerOptimizer; -import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.cache.VillagerManager; +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; import org.bukkit.event.EventPriority; @@ -16,7 +19,7 @@ public class RestockTrades implements VillagerOptimizerModule, Listener { private final VillagerManager villagerManager; private final long restock_delay; - private final boolean shouldLog; + private final boolean shouldLog, notifyPlayer; protected RestockTrades() { this.villagerManager = VillagerOptimizer.getVillagerManager(); @@ -25,8 +28,10 @@ public class RestockTrades implements VillagerOptimizerModule, Listener { This is for automatic restocking of trades for optimized villagers. Optimized Villagers\s Don't have enough AI to do trade restocks themselves, so this needs to always be enabled. """); - this.restock_delay = config.getInt("optimization.trade-restocking.delay-in-ticks", 1200); + this.restock_delay = config.getInt("optimization.trade-restocking.delay-in-ticks", 1200) * 50L; this.shouldLog = config.getBoolean("optimization.trade-restocking.log", false); + this.notifyPlayer = config.getBoolean("optimization.trade-restocking.notify-player", true, + "Sends the player a message when the trades were restocked on a clicked villager."); } @Override @@ -48,9 +53,19 @@ public class RestockTrades 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()) return; - + if (wVillager.isOptimized() && wVillager.canRestock(restock_delay)) { + wVillager.restock(); + if (notifyPlayer) { + Player player = event.getPlayer(); + VillagerOptimizer.getLang(player.locale()).trades_restocked.forEach(line -> player.sendMessage(line + .replaceText(TextReplacementConfig.builder().matchLiteral("%time%").replacement(CommonUtils.formatTime(restock_delay)).build())) + ); + } + if (shouldLog) + VillagerOptimizer.getLog().info("Restocked optimized villager at "+ wVillager.villager().getLocation()); + } } } diff --git a/src/main/java/me/xginko/villageroptimizer/utils/LogUtils.java b/src/main/java/me/xginko/villageroptimizer/utils/LogUtils.java index 20c5c70..e31d0cc 100644 --- a/src/main/java/me/xginko/villageroptimizer/utils/LogUtils.java +++ b/src/main/java/me/xginko/villageroptimizer/utils/LogUtils.java @@ -7,7 +7,7 @@ import java.util.logging.Level; public class LogUtils { public static void moduleLog(Level logLevel, String path, String logMessage) { - VillagerOptimizer.getLog().log(logLevel, "<" + path + "> " + logMessage); + VillagerOptimizer.getLog().log(logLevel, "(" + path + ") " + logMessage); } public static void materialNotRecognized(String path, String material) { diff --git a/src/main/resources/lang/en_us.yml b/src/main/resources/lang/en_us.yml index 23a6df7..aabc4f5 100644 --- a/src/main/resources/lang/en_us.yml +++ b/src/main/resources/lang/en_us.yml @@ -1,5 +1,7 @@ messages: no-permission: "You don't have permission to use this command." + restock-success: + - "All trades restocked! Next restock in %time%" nametag: optimize-success: - "Successfully optimized villager by using a nametag."