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