diff --git a/pom.xml b/pom.xml
index 8c36880..1b20091 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
me.xginko
VillagerOptimizer
- 1.6.2
+ 1.7.0
jar
VillagerOptimizer
@@ -187,7 +187,7 @@
com.github.cryptomorin
XSeries
- 11.2.0.1
+ 11.2.1
diff --git a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java
index 21a1872..dac7025 100644
--- a/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java
+++ b/src/main/java/me/xginko/villageroptimizer/VillagerOptimizer.java
@@ -5,7 +5,7 @@ import com.github.benmanes.caffeine.cache.Caffeine;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.config.Config;
import me.xginko.villageroptimizer.config.LanguageCache;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java
index 5c3560d..8fde36e 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/VillagerOptimizerCommand.java
@@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.commands;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.utils.Disableable;
-import me.xginko.villageroptimizer.utils.Enableable;
+import me.xginko.villageroptimizer.struct.Disableable;
+import me.xginko.villageroptimizer.struct.Enableable;
import org.bukkit.command.CommandException;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.PluginCommand;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java
index 486a86a..18a0096 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/optimizevillagers/OptVillagersRadius.java
@@ -3,8 +3,8 @@ package me.xginko.villageroptimizer.commands.optimizevillagers;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.config.Config;
-import me.xginko.villageroptimizer.enums.OptimizationType;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerOptimizeEvent;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java
index 18a061d..55dddc9 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/unoptimizevillagers/UnOptVillagersRadius.java
@@ -2,8 +2,8 @@ package me.xginko.villageroptimizer.commands.unoptimizevillagers;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
-import me.xginko.villageroptimizer.enums.OptimizationType;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java
index 32cc2a2..5bdae8c 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/VillagerOptimizerCmd.java
@@ -5,7 +5,7 @@ import me.xginko.villageroptimizer.commands.VillagerOptimizerCommand;
import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.DisableSubCmd;
import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.ReloadSubCmd;
import me.xginko.villageroptimizer.commands.villageroptimizer.subcommands.VersionSubCmd;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.Util;
import net.kyori.adventure.text.Component;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java
index fe0fce9..bc6c291 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/DisableSubCmd.java
@@ -2,7 +2,7 @@ package me.xginko.villageroptimizer.commands.villageroptimizer.subcommands;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.SubCommand;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.Util;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java
index 97f82ee..890ac4b 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/ReloadSubCmd.java
@@ -2,7 +2,7 @@ package me.xginko.villageroptimizer.commands.villageroptimizer.subcommands;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.SubCommand;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.Util;
import net.kyori.adventure.text.Component;
diff --git a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java
index d8d4c65..c023fb5 100644
--- a/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java
+++ b/src/main/java/me/xginko/villageroptimizer/commands/villageroptimizer/subcommands/VersionSubCmd.java
@@ -3,7 +3,7 @@ package me.xginko.villageroptimizer.commands.villageroptimizer.subcommands;
import io.papermc.paper.plugin.configuration.PluginMeta;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.commands.SubCommand;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.Util;
import net.kyori.adventure.text.Component;
diff --git a/src/main/java/me/xginko/villageroptimizer/config/Config.java b/src/main/java/me/xginko/villageroptimizer/config/Config.java
index bb6ce88..a21a2c8 100644
--- a/src/main/java/me/xginko/villageroptimizer/config/Config.java
+++ b/src/main/java/me/xginko/villageroptimizer/config/Config.java
@@ -118,13 +118,13 @@ public class Config {
return this.config.getInteger(path, def);
}
- public @NotNull List getList(@NotNull String path, @NotNull List def, @NotNull String comment) {
+ public @NotNull List getList(@NotNull String path, @NotNull List def, @NotNull String comment) {
this.config.addDefault(path, def, comment);
- return this.config.getStringList(path);
+ return this.config.getList(path);
}
- public @NotNull List getList(@NotNull String path, @NotNull List def) {
+ public @NotNull List getList(@NotNull String path, @NotNull List def) {
this.config.addDefault(path, def);
- return this.config.getStringList(path);
+ return this.config.getList(path);
}
}
diff --git a/src/main/java/me/xginko/villageroptimizer/events/VillagerOptimizeEvent.java b/src/main/java/me/xginko/villageroptimizer/events/VillagerOptimizeEvent.java
index caf1de1..05a37d3 100644
--- a/src/main/java/me/xginko/villageroptimizer/events/VillagerOptimizeEvent.java
+++ b/src/main/java/me/xginko/villageroptimizer/events/VillagerOptimizeEvent.java
@@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.events;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
diff --git a/src/main/java/me/xginko/villageroptimizer/events/VillagerUnoptimizeEvent.java b/src/main/java/me/xginko/villageroptimizer/events/VillagerUnoptimizeEvent.java
index 6eb6f8d..35334e9 100644
--- a/src/main/java/me/xginko/villageroptimizer/events/VillagerUnoptimizeEvent.java
+++ b/src/main/java/me/xginko/villageroptimizer/events/VillagerUnoptimizeEvent.java
@@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.events;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.entity.Player;
import org.bukkit.event.Cancellable;
import org.bukkit.event.Event;
diff --git a/src/main/java/me/xginko/villageroptimizer/logging/ComponentLoggerProviderImpl.java b/src/main/java/me/xginko/villageroptimizer/logging/ComponentLoggerProviderImpl.java
index 7763dbb..5b3c990 100644
--- a/src/main/java/me/xginko/villageroptimizer/logging/ComponentLoggerProviderImpl.java
+++ b/src/main/java/me/xginko/villageroptimizer/logging/ComponentLoggerProviderImpl.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.utils;
+package me.xginko.villageroptimizer.logging;
import net.kyori.adventure.text.logger.slf4j.ComponentLogger;
import net.kyori.adventure.text.logger.slf4j.ComponentLoggerProvider;
diff --git a/src/main/java/me/xginko/villageroptimizer/logging/TranslatableMapper.java b/src/main/java/me/xginko/villageroptimizer/logging/TranslatableMapper.java
index dd65de1..4f88a20 100644
--- a/src/main/java/me/xginko/villageroptimizer/logging/TranslatableMapper.java
+++ b/src/main/java/me/xginko/villageroptimizer/logging/TranslatableMapper.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.utils;
+package me.xginko.villageroptimizer.logging;
import net.kyori.adventure.text.Component;
import net.kyori.adventure.text.TranslatableComponent;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java
index d4aa3e1..1106bb0 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/VillagerChunkLimit.java
@@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.modules;
import com.cryptomorin.xseries.XEntityType;
-import me.xginko.villageroptimizer.utils.ExpiringSet;
+import me.xginko.villageroptimizer.struct.models.ExpiringSet;
import me.xginko.villageroptimizer.utils.LocationUtil;
import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java b/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java
index d0a93ea..954862d 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/VillagerOptimizerModule.java
@@ -3,8 +3,8 @@ package me.xginko.villageroptimizer.modules;
import com.github.benmanes.caffeine.cache.Cache;
import me.xginko.villageroptimizer.VillagerOptimizer;
import me.xginko.villageroptimizer.config.Config;
-import me.xginko.villageroptimizer.utils.Disableable;
-import me.xginko.villageroptimizer.utils.Enableable;
+import me.xginko.villageroptimizer.struct.Disableable;
+import me.xginko.villageroptimizer.struct.Enableable;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import org.bukkit.entity.Villager;
import org.reflections.Reflections;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java
index 334177e..56a0ba9 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/PreventUnoptimizedTrading.java
@@ -1,7 +1,7 @@
package me.xginko.villageroptimizer.modules.gameplay;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/RestockOptimizedTrades.java b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/RestockOptimizedTrades.java
index 3fefbbb..9e75422 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/RestockOptimizedTrades.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/RestockOptimizedTrades.java
@@ -2,14 +2,13 @@ package me.xginko.villageroptimizer.modules.gameplay;
import com.cryptomorin.xseries.XEntityType;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.Permissions;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.utils.KyoriUtil;
import me.xginko.villageroptimizer.utils.LocationUtil;
import me.xginko.villageroptimizer.utils.Util;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import net.kyori.adventure.text.TextReplacementConfig;
-import org.bukkit.entity.Player;
import org.bukkit.entity.Villager;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
@@ -18,10 +17,14 @@ import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerInteractEntityEvent;
import java.time.Duration;
+import java.util.Arrays;
+import java.util.Comparator;
+import java.util.SortedSet;
+import java.util.TreeSet;
public class RestockOptimizedTrades extends VillagerOptimizerModule implements Listener {
- private final long restock_delay_millis;
+ private final SortedSet restockDayTimes;
private final boolean log_enabled, notify_player;
public RestockOptimizedTrades() {
@@ -29,8 +32,10 @@ public class RestockOptimizedTrades extends VillagerOptimizerModule implements L
config.master().addComment(configPath,
"This is for automatic restocking of trades for optimized villagers. Optimized Villagers\n" +
"don't have enough AI to restock their trades naturally, so this is here as a workaround.");
- this.restock_delay_millis = config.getInt(configPath + ".delay-in-ticks", 1000,
- "1 second = 20 ticks. There are 24.000 ticks in a single minecraft day.") * 50L;
+ this.restockDayTimes = new TreeSet<>(Comparator.reverseOrder());
+ this.restockDayTimes.addAll(config.getList(configPath + ".restock-times", Arrays.asList(1000L, 13000L),
+ "At which (tick-)times during the day villagers will restock.\n" +
+ "There are 24.000 ticks in a single minecraft day."));
this.notify_player = config.getBoolean(configPath + ".notify-player", true,
"Sends the player a message when the trades were restocked on a clicked villager.");
this.log_enabled = config.getBoolean(configPath + ".log", false);
@@ -52,26 +57,50 @@ public class RestockOptimizedTrades extends VillagerOptimizerModule implements L
}
@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
- private void onInteract(PlayerInteractEntityEvent event) {
+ private void onPlayerInteractEntity(PlayerInteractEntityEvent event) {
if (event.getRightClicked().getType() != XEntityType.VILLAGER.get()) return;
- final WrappedVillager wrapped = wrapperCache.get((Villager) event.getRightClicked(), WrappedVillager::new);
+ WrappedVillager wrapped = wrapperCache.get((Villager) event.getRightClicked(), WrappedVillager::new);
if (!wrapped.isOptimized()) return;
- final Player player = event.getPlayer();
- final boolean player_bypassing = player.hasPermission(Permissions.Bypass.RESTOCK_COOLDOWN.get());
- if (!wrapped.canRestock(restock_delay_millis) && !player_bypassing) return;
+ if (event.getPlayer().hasPermission(Permissions.Bypass.RESTOCK_COOLDOWN.get())) {
+ wrapped.restock();
+ return;
+ }
- wrapped.restock();
- wrapped.saveRestockTime();
+ long lastRestockFullTimeTicks = wrapped.getLastRestockFullTime();
+ long currentFullTimeTicks = wrapped.currentFullTimeTicks();
+ long currentDayTimeTicks = wrapped.currentDayTimeTicks();
- if (notify_player && !player_bypassing) {
+ long currentDay = currentFullTimeTicks - currentDayTimeTicks;
+ long ticksTillRestock = (24000 + currentDay + restockDayTimes.first()) - currentFullTimeTicks;
+
+ boolean restocked = false;
+
+ for (Long restockDayTime : restockDayTimes) {
+ long restockTimeToday = currentDay + restockDayTime;
+
+ if (currentFullTimeTicks < restockTimeToday || lastRestockFullTimeTicks >= restockTimeToday) {
+ ticksTillRestock = Math.min(ticksTillRestock, restockTimeToday - currentFullTimeTicks);
+ continue;
+ }
+
+ wrapped.restock();
+ wrapped.saveRestockTime();
+ restocked = true;
+
+ break;
+ }
+
+ if (!restocked) return;
+
+ if (notify_player) {
final TextReplacementConfig timeLeft = TextReplacementConfig.builder()
.matchLiteral("%time%")
- .replacement(Util.formatDuration(Duration.ofMillis(wrapped.getRestockCooldownMillis(restock_delay_millis))))
+ .replacement(Util.formatDuration(Duration.ofMillis(ticksTillRestock * 50L)))
.build();
- VillagerOptimizer.getLang(player.locale()).trades_restocked
- .forEach(line -> KyoriUtil.sendMessage(player, line.replaceText(timeLeft)));
+ VillagerOptimizer.getLang(event.getPlayer().locale()).trades_restocked
+ .forEach(line -> KyoriUtil.sendMessage(event.getPlayer(), line.replaceText(timeLeft)));
}
if (log_enabled) {
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/UnoptimizeOnJobLoose.java b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/UnoptimizeOnJobLoose.java
index 57973af..ca52896 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/gameplay/UnoptimizeOnJobLoose.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/gameplay/UnoptimizeOnJobLoose.java
@@ -1,6 +1,6 @@
package me.xginko.villageroptimizer.modules.gameplay;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
import me.xginko.villageroptimizer.wrapper.WrappedVillager;
import org.bukkit.event.EventHandler;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java
index 1a16df8..e3775a2 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByBlock.java
@@ -2,8 +2,8 @@ package me.xginko.villageroptimizer.modules.optimization;
import com.cryptomorin.xseries.XMaterial;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.OptimizationType;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerOptimizeEvent;
import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByNametag.java b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByNametag.java
index 4314bc6..63c1a3f 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByNametag.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByNametag.java
@@ -3,8 +3,8 @@ package me.xginko.villageroptimizer.modules.optimization;
import com.cryptomorin.xseries.XEntityType;
import com.cryptomorin.xseries.XMaterial;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.OptimizationType;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerOptimizeEvent;
import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
diff --git a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByWorkstation.java b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByWorkstation.java
index cb1c909..e96270b 100644
--- a/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByWorkstation.java
+++ b/src/main/java/me/xginko/villageroptimizer/modules/optimization/OptimizeByWorkstation.java
@@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.modules.optimization;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.OptimizationType;
-import me.xginko.villageroptimizer.enums.Permissions;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Permissions;
import me.xginko.villageroptimizer.events.VillagerOptimizeEvent;
import me.xginko.villageroptimizer.events.VillagerUnoptimizeEvent;
import me.xginko.villageroptimizer.modules.VillagerOptimizerModule;
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/Disableable.java b/src/main/java/me/xginko/villageroptimizer/struct/Disableable.java
index e2ad4a2..d9962d2 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/Disableable.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/Disableable.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.utils;
+package me.xginko.villageroptimizer.struct;
public interface Disableable {
void disable();
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/Enableable.java b/src/main/java/me/xginko/villageroptimizer/struct/Enableable.java
index 736fd4a..09d4f13 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/Enableable.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/Enableable.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.utils;
+package me.xginko.villageroptimizer.struct;
public interface Enableable {
void enable();
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/enums/Keyring.java b/src/main/java/me/xginko/villageroptimizer/struct/enums/Keyring.java
index 53caade..f11eaed 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/enums/Keyring.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/enums/Keyring.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.enums;
+package me.xginko.villageroptimizer.struct.enums;
import net.kyori.adventure.key.Namespaced;
import org.bukkit.Keyed;
@@ -52,7 +52,7 @@ public final class Keyring {
OPTIMIZATION_TYPE("optimization-type"),
LAST_OPTIMIZE_SYSTIME_MILLIS("last-optimize"),
LAST_LEVELUP_SYSTIME_MILLIS("last-levelup"),
- LAST_RESTOCK_SYSTIME_MILLIS("last-restock-systime");
+ LAST_RESTOCK_WORLD_FULLTIME("last-restock-full-time");
private final @NotNull NamespacedKey key;
@@ -69,7 +69,7 @@ public final class Keyring {
public enum AntiVillagerLag implements Keyed {
NEXT_OPTIMIZATION_SYSTIME_SECONDS("cooldown"), // Returns LONG -> (System.currentTimeMillis() / 1000) + cooldown seconds
- LAST_RESTOCK_WORLDFULLTIME("time"), // Returns LONG -> villager.getWorld().getFullTime()
+ LAST_RESTOCK_WORLD_FULLTIME("time"), // Returns LONG -> villager.getWorld().getFullTime()
NEXT_LEVELUP_SYSTIME_SECONDS("levelCooldown"), // Returns LONG -> (System.currentTimeMillis() / 1000) + cooldown seconds
OPTIMIZED_ANY("Marker"), // Returns STRING -> "AVL"
OPTIMIZED_BLOCK("disabledByBlock"), // Returns STRING -> key().toString()
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/enums/OptimizationType.java b/src/main/java/me/xginko/villageroptimizer/struct/enums/OptimizationType.java
index 23025bf..d975180 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/enums/OptimizationType.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/enums/OptimizationType.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.enums;
+package me.xginko.villageroptimizer.struct.enums;
public enum OptimizationType {
COMMAND,
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/enums/Permissions.java b/src/main/java/me/xginko/villageroptimizer/struct/enums/Permissions.java
index ac02fd0..37cb227 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/enums/Permissions.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/enums/Permissions.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.enums;
+package me.xginko.villageroptimizer.struct.enums;
import org.bukkit.Bukkit;
import org.bukkit.permissions.Permission;
diff --git a/src/main/java/me/xginko/villageroptimizer/struct/models/ExpiringSet.java b/src/main/java/me/xginko/villageroptimizer/struct/models/ExpiringSet.java
index 28bc612..f19c943 100644
--- a/src/main/java/me/xginko/villageroptimizer/struct/models/ExpiringSet.java
+++ b/src/main/java/me/xginko/villageroptimizer/struct/models/ExpiringSet.java
@@ -1,4 +1,4 @@
-package me.xginko.villageroptimizer.utils;
+package me.xginko.villageroptimizer.struct.models;
import com.github.benmanes.caffeine.cache.Cache;
import com.github.benmanes.caffeine.cache.Caffeine;
diff --git a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapper.java b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapper.java
index 05905b8..beffb23 100644
--- a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapper.java
+++ b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapper.java
@@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.wrapper;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.Keyring;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Keyring;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.entity.Villager;
import org.bukkit.persistence.PersistentDataContainer;
import org.jetbrains.annotations.NotNull;
@@ -68,29 +68,17 @@ public abstract class PDCWrapper {
public abstract long getOptimizeCooldownMillis(long cooldown_millis);
/**
- * For convenience so the remaining millis since the last stored restock time
- * can be easily calculated.
- *
- * @param cooldown_millis The configured cooldown in milliseconds you want to check against.
- * @return True if the villager has been loaded long enough.
+ * Gets the time of the day in ticks when the entity was last restocked.
+ * This value is affected by /time set
+ * @return The time of the minecraft day (in ticks) when the villager was last restocked
*/
- public abstract boolean canRestock(long cooldown_millis);
+ public abstract long getLastRestockFullTime();
/**
* Saves the time of when the entity was last restocked.
*/
public abstract void saveRestockTime();
- /**
- * For convenience so the remaining millis since the last stored restock time
- * can be easily calculated.
- * This enables new configured cooldowns to instantly apply instead of them being persistent.
- *
- * @param cooldown_millis The configured cooldown in milliseconds you want to check against.
- * @return The time left in millis until the villager can be restocked again.
- */
- public abstract long getRestockCooldownMillis(long cooldown_millis);
-
/**
* @param cooldown_millis The configured cooldown in milliseconds you want to check against.
* @return Whether the villager can be leveled up or not with the checked milliseconds
diff --git a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperAVL.java b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperAVL.java
index 626d910..ebadf07 100644
--- a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperAVL.java
+++ b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperAVL.java
@@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.wrapper;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.Keyring;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Keyring;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.entity.Villager;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
@@ -99,21 +99,16 @@ public final class PDCWrapperAVL extends PDCWrapper {
}
@Override
- public boolean canRestock(long cooldown_millis) {
- return !dataContainer.has(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLDFULLTIME.getKey(), PersistentDataType.LONG)
- || villager.getWorld().getFullTime() > dataContainer.get(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLDFULLTIME.getKey(), PersistentDataType.LONG);
+ public long getLastRestockFullTime() {
+ if (dataContainer.has(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG)) {
+ return dataContainer.get(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG);
+ }
+ return 0L;
}
@Override
public void saveRestockTime() {
- dataContainer.set(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLDFULLTIME.getKey(), PersistentDataType.LONG, villager.getWorld().getFullTime());
- }
-
- @Override
- public long getRestockCooldownMillis(long cooldown_millis) {
- if (dataContainer.has(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLDFULLTIME.getKey(), PersistentDataType.LONG))
- return (villager.getWorld().getFullTime() - dataContainer.get(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLDFULLTIME.getKey(), PersistentDataType.LONG)) * 50L;
- return cooldown_millis;
+ dataContainer.set(Keyring.AntiVillagerLag.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG, villager.getWorld().getFullTime());
}
@Override
diff --git a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperVO.java b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperVO.java
index 1eb8daf..c159664 100644
--- a/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperVO.java
+++ b/src/main/java/me/xginko/villageroptimizer/wrapper/PDCWrapperVO.java
@@ -1,8 +1,8 @@
package me.xginko.villageroptimizer.wrapper;
import me.xginko.villageroptimizer.VillagerOptimizer;
-import me.xginko.villageroptimizer.enums.Keyring;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.struct.enums.Keyring;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.entity.Villager;
import org.bukkit.persistence.PersistentDataType;
import org.jetbrains.annotations.NotNull;
@@ -82,30 +82,16 @@ public final class PDCWrapperVO extends PDCWrapper {
}
@Override
- public boolean canRestock(long cooldown_millis) {
- return getLastRestock() + cooldown_millis <= System.currentTimeMillis();
- }
-
- @Override
- public void saveRestockTime() {
- dataContainer.set(Keyring.VillagerOptimizer.LAST_RESTOCK_SYSTIME_MILLIS.getKey(), PersistentDataType.LONG, System.currentTimeMillis());
- }
-
- /**
- * @return The time when the entity was last restocked.
- */
- private long getLastRestock() {
- if (dataContainer.has(Keyring.VillagerOptimizer.LAST_RESTOCK_SYSTIME_MILLIS.getKey(), PersistentDataType.LONG)) {
- return dataContainer.get(Keyring.VillagerOptimizer.LAST_RESTOCK_SYSTIME_MILLIS.getKey(), PersistentDataType.LONG);
+ public long getLastRestockFullTime() {
+ if (dataContainer.has(Keyring.VillagerOptimizer.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG)) {
+ return dataContainer.get(Keyring.VillagerOptimizer.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG);
}
return 0L;
}
@Override
- public long getRestockCooldownMillis(long cooldown_millis) {
- if (dataContainer.has(Keyring.VillagerOptimizer.LAST_RESTOCK_SYSTIME_MILLIS.getKey(), PersistentDataType.LONG))
- return System.currentTimeMillis() - (dataContainer.get(Keyring.VillagerOptimizer.LAST_RESTOCK_SYSTIME_MILLIS.getKey(), PersistentDataType.LONG) + cooldown_millis);
- return cooldown_millis;
+ public void saveRestockTime() {
+ dataContainer.set(Keyring.VillagerOptimizer.LAST_RESTOCK_WORLD_FULLTIME.getKey(), PersistentDataType.LONG, villager.getWorld().getFullTime());
}
@Override
diff --git a/src/main/java/me/xginko/villageroptimizer/wrapper/WrappedVillager.java b/src/main/java/me/xginko/villageroptimizer/wrapper/WrappedVillager.java
index 3d496e9..22d669d 100644
--- a/src/main/java/me/xginko/villageroptimizer/wrapper/WrappedVillager.java
+++ b/src/main/java/me/xginko/villageroptimizer/wrapper/WrappedVillager.java
@@ -1,7 +1,8 @@
package me.xginko.villageroptimizer.wrapper;
-import me.xginko.villageroptimizer.enums.Keyring;
-import me.xginko.villageroptimizer.enums.OptimizationType;
+import me.xginko.villageroptimizer.VillagerOptimizer;
+import me.xginko.villageroptimizer.struct.enums.Keyring;
+import me.xginko.villageroptimizer.struct.enums.OptimizationType;
import org.bukkit.Location;
import org.bukkit.Sound;
import org.bukkit.entity.Villager;
@@ -19,13 +20,31 @@ public class WrappedVillager extends PDCWrapper {
this.pdcWrappers = PDCWrapper.forVillager(villager);
}
+ /**
+ * Returns a number between 0 and 24000
+ * is affected by /time set
+ */
+ public long currentDayTimeTicks() {
+ return villager.getWorld().getTime();
+ }
+
+ /**
+ * Returns the tick time of the world
+ * is affected by /time set
+ */
+ public long currentFullTimeTicks() {
+ return villager.getWorld().getFullTime();
+ }
+
/**
* Restock all trading recipes.
*/
public void restock() {
- for (MerchantRecipe recipe : villager.getRecipes()) {
- recipe.setUses(0);
- }
+ VillagerOptimizer.scheduling().entitySpecificScheduler(villager).run(() -> {
+ for (MerchantRecipe recipe : villager.getRecipes()) {
+ recipe.setUses(0);
+ }
+ }, null);
}
/**
@@ -126,13 +145,12 @@ public class WrappedVillager extends PDCWrapper {
}
@Override
- public boolean canRestock(long cooldown_millis) {
+ public long getLastRestockFullTime() {
+ long cooldown = 0L;
for (PDCWrapper pdcWrapper : pdcWrappers) {
- if (!pdcWrapper.canRestock(cooldown_millis)) {
- return false;
- }
+ cooldown = Math.max(cooldown, pdcWrapper.getLastRestockFullTime());
}
- return true;
+ return cooldown;
}
@Override
@@ -142,15 +160,6 @@ public class WrappedVillager extends PDCWrapper {
}
}
- @Override
- public long getRestockCooldownMillis(long cooldown_millis) {
- long cooldown = cooldown_millis;
- for (PDCWrapper pdcWrapper : pdcWrappers) {
- cooldown = Math.max(cooldown, pdcWrapper.getRestockCooldownMillis(cooldown_millis));
- }
- return cooldown;
- }
-
@Override
public boolean canLevelUp(long cooldown_millis) {
for (PDCWrapper pdcWrapper : pdcWrappers) {
diff --git a/src/main/resources/META-INF/services/me.xginko.villageroptimizer.libs.kyori.adventure.text.logger.slf4j.ComponentLoggerProvider b/src/main/resources/META-INF/services/me.xginko.villageroptimizer.libs.kyori.adventure.text.logger.slf4j.ComponentLoggerProvider
index 535b896..7673648 100644
--- a/src/main/resources/META-INF/services/me.xginko.villageroptimizer.libs.kyori.adventure.text.logger.slf4j.ComponentLoggerProvider
+++ b/src/main/resources/META-INF/services/me.xginko.villageroptimizer.libs.kyori.adventure.text.logger.slf4j.ComponentLoggerProvider
@@ -1 +1 @@
-me.xginko.villageroptimizer.utils.ComponentLoggerProviderImpl
\ No newline at end of file
+me.xginko.villageroptimizer.logging.ComponentLoggerProviderImpl
\ No newline at end of file