From f2850d11ab09203e01f274d6c0a1e3757459c7b0 Mon Sep 17 00:00:00 2001 From: xGinko Date: Wed, 6 Sep 2023 00:08:16 +0200 Subject: [PATCH] a bit of progress --- .../villageroptimizer/config/Config.java | 2 + .../xginko/villageroptimizer/enums/Keys.java | 3 +- .../models/WrappedVillager.java | 51 ++++++++++++------- .../modules/RestockOptimized.java | 48 +++++++++++++++++ .../modules/WorkstationOptimization.java | 6 ++- 5 files changed, 90 insertions(+), 20 deletions(-) create mode 100644 src/main/java/me/xginko/villageroptimizer/modules/RestockOptimized.java diff --git a/src/main/java/me/xginko/villageroptimizer/config/Config.java b/src/main/java/me/xginko/villageroptimizer/config/Config.java index cdb18ff..cefdd74 100644 --- a/src/main/java/me/xginko/villageroptimizer/config/Config.java +++ b/src/main/java/me/xginko/villageroptimizer/config/Config.java @@ -19,6 +19,7 @@ public class Config { public final Locale default_lang; public final boolean auto_lang, enable_nametag_optimization, enable_workstation_optimization, enable_block_optimization, cache_enabled; + public final int state_change_cooldown; public final double workstation_max_distance; public final long cache_keep_time_seconds; @@ -45,6 +46,7 @@ public class Config { /** * Optimization */ + this.state_change_cooldown = getInt("optimization.state-change-cooldown-in-seconds", 600); // 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") diff --git a/src/main/java/me/xginko/villageroptimizer/enums/Keys.java b/src/main/java/me/xginko/villageroptimizer/enums/Keys.java index e8b313f..04a3672 100644 --- a/src/main/java/me/xginko/villageroptimizer/enums/Keys.java +++ b/src/main/java/me/xginko/villageroptimizer/enums/Keys.java @@ -6,8 +6,7 @@ import org.bukkit.NamespacedKey; public enum Keys { OPTIMIZED(VillagerOptimizer.getKey("optimized")), - COOLDOWN_OPTIMIZE(VillagerOptimizer.getKey("optimization-toggle-cooldown")), - COOLDOWN_RESTOCK(VillagerOptimizer.getKey("restock-cooldown")), + COOLDOWN_OPTIMIZE(VillagerOptimizer.getKey("optimize-state-change-cooldown")), COOLDOWN_EXPERIENCE(VillagerOptimizer.getKey("experience-cooldown")), WORLDTIME(VillagerOptimizer.getKey("world-time")); diff --git a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java index 3bf3db8..ae16abb 100644 --- a/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java +++ b/src/main/java/me/xginko/villageroptimizer/models/WrappedVillager.java @@ -7,38 +7,55 @@ import org.bukkit.entity.Villager; import org.bukkit.persistence.PersistentDataContainer; import org.bukkit.persistence.PersistentDataType; -public record WrappedVillager(Villager villager) { +public final class WrappedVillager { + + private final Villager villager; + private final PersistentDataContainer villagerData; + + public WrappedVillager(Villager villager) { + this.villager = villager; + this.villagerData = villager.getPersistentDataContainer(); + } + + public Villager villager() { + return villager; + } public static WrappedVillager fromVillager(Villager villager) { return VillagerOptimizer.getVillagerCache().get(villager); } public boolean isOptimized() { - return villager.getPersistentDataContainer().has(Keys.OPTIMIZED.key()); + return villagerData.has(Keys.OPTIMIZED.key()); } - public void setOptimization(OptimizationType type) { + public boolean setOptimization(OptimizationType type) { + if (isOnOptimizeCooldown()) return false; + if (type.equals(OptimizationType.OFF) && isOptimized()) { - villager.getPersistentDataContainer().remove(Keys.OPTIMIZED.key()); + villagerData.remove(Keys.OPTIMIZED.key()); villager.setAware(true); villager.setAI(true); + setOptimizeCooldown(VillagerOptimizer.getConfiguration().state_change_cooldown); } else { - villager.getPersistentDataContainer().set(Keys.OPTIMIZED.key(), PersistentDataType.STRING, type.name()); + villagerData.set(Keys.OPTIMIZED.key(), PersistentDataType.STRING, type.name()); villager.setAware(false); + setOptimizeCooldown(VillagerOptimizer.getConfiguration().state_change_cooldown); } + + return true; } public OptimizationType getOptimizationType() { - return isOptimized() ? OptimizationType.valueOf(villager().getPersistentDataContainer().get(Keys.OPTIMIZED.key(), PersistentDataType.STRING)) : OptimizationType.OFF; + return isOptimized() ? OptimizationType.valueOf(villagerData.get(Keys.OPTIMIZED.key(), PersistentDataType.STRING)) : OptimizationType.OFF; } - public void setRestockCooldown(long milliseconds) { - villager.getPersistentDataContainer().set(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); + public void setOptimizeCooldown(long milliseconds) { + villagerData.set(Keys.COOLDOWN_OPTIMIZE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); } - public boolean shouldRestock() { - PersistentDataContainer villagerData = villager.getPersistentDataContainer(); - return villagerData.has(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) && villagerData.get(Keys.COOLDOWN_RESTOCK.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); + public boolean isOnOptimizeCooldown() { + return villagerData.has(Keys.COOLDOWN_OPTIMIZE.key(), PersistentDataType.LONG) && villagerData.get(Keys.COOLDOWN_OPTIMIZE.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); } public void restock() { @@ -46,20 +63,20 @@ public record WrappedVillager(Villager villager) { } public void setExpCooldown(long milliseconds) { - villager.getPersistentDataContainer().set(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); + villagerData.set(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG, System.currentTimeMillis() + milliseconds); } public boolean isOnExpCooldown() { - PersistentDataContainer villagerData = villager.getPersistentDataContainer(); return villagerData.has(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) && villagerData.get(Keys.COOLDOWN_EXPERIENCE.key(), PersistentDataType.LONG) <= System.currentTimeMillis(); } - public void saveWorldTime() { - villager.getPersistentDataContainer().set(Keys.WORLDTIME.key(), PersistentDataType.LONG, villager.getWorld().getFullTime()); + public long saveWorldTime() { + final long worldTime = villager.getWorld().getFullTime(); + villagerData.set(Keys.WORLDTIME.key(), PersistentDataType.LONG, worldTime); + return worldTime; } public long getSavedWorldTime() { - PersistentDataContainer villagerData = villager.getPersistentDataContainer(); - return villagerData.has(Keys.WORLDTIME.key(), PersistentDataType.LONG) ? villagerData.get(Keys.WORLDTIME.key(), PersistentDataType.LONG) : villager.getWorld().getFullTime(); + return villagerData.has(Keys.WORLDTIME.key(), PersistentDataType.LONG) ? villagerData.get(Keys.WORLDTIME.key(), PersistentDataType.LONG) : saveWorldTime(); } } diff --git a/src/main/java/me/xginko/villageroptimizer/modules/RestockOptimized.java b/src/main/java/me/xginko/villageroptimizer/modules/RestockOptimized.java new file mode 100644 index 0000000..fc2b45b --- /dev/null +++ b/src/main/java/me/xginko/villageroptimizer/modules/RestockOptimized.java @@ -0,0 +1,48 @@ +package me.xginko.villageroptimizer.modules; + +import me.xginko.villageroptimizer.VillagerOptimizer; +import me.xginko.villageroptimizer.config.Config; +import me.xginko.villageroptimizer.models.WrappedVillager; +import org.bukkit.entity.EntityType; +import org.bukkit.entity.Villager; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.HandlerList; +import org.bukkit.event.Listener; +import org.bukkit.event.player.PlayerInteractEntityEvent; + +public class RestockOptimized implements VillagerOptimizerModule, Listener { + + private final long restock_delay; + private final boolean shouldLog; + + public RestockOptimized() { + Config config = VillagerOptimizer.getConfiguration(); + this.restock_delay = config.getInt("") + } + + @Override + public void enable() { + VillagerOptimizer plugin = VillagerOptimizer.getInstance(); + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @Override + public void disable() { + HandlerList.unregisterAll(this); + } + + @Override + public boolean shouldEnable() { + return true; + } + + @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) + private void onInteract(PlayerInteractEntityEvent event) { + if (!event.getRightClicked().getType().equals(EntityType.VILLAGER)) return; + WrappedVillager wrappedVillager = new WrappedVillager((Villager) event.getRightClicked()); + if (!wrappedVillager.isOptimized()) return; + + if (wrappedVillager.getSavedWorldTime() >) + } +} diff --git a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java index 0daa386..f4d9898 100644 --- a/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java +++ b/src/main/java/me/xginko/villageroptimizer/modules/WorkstationOptimization.java @@ -1,8 +1,10 @@ package me.xginko.villageroptimizer.modules; +import io.papermc.paper.event.entity.EntityMoveEvent; import me.xginko.villageroptimizer.VillagerOptimizer; import me.xginko.villageroptimizer.config.Config; import me.xginko.villageroptimizer.models.VillagerCache; +import org.bukkit.entity.EntityType; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; @@ -37,7 +39,9 @@ public class WorkstationOptimization implements VillagerOptimizerModule, Listene } @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) - private void onEvent() { + private void onEntityMove(EntityMoveEvent event) { + if (!event.getEntity().getType().equals(EntityType.VILLAGER)) return; + } }