diff --git a/bukkit/src/main/java/dev/jsinco/brewery/bukkit/TheBrewingProject.java b/bukkit/src/main/java/dev/jsinco/brewery/bukkit/TheBrewingProject.java index 5dbec354e..9308c13aa 100644 --- a/bukkit/src/main/java/dev/jsinco/brewery/bukkit/TheBrewingProject.java +++ b/bukkit/src/main/java/dev/jsinco/brewery/bukkit/TheBrewingProject.java @@ -1,12 +1,12 @@ package dev.jsinco.brewery.bukkit; import com.google.common.base.Preconditions; -import dev.jsinco.brewery.api.config.Configuration; import dev.jsinco.brewery.api.brew.BrewManager; import dev.jsinco.brewery.api.breweries.Barrel; import dev.jsinco.brewery.api.breweries.BarrelType; import dev.jsinco.brewery.api.breweries.Distillery; import dev.jsinco.brewery.api.breweries.Tickable; +import dev.jsinco.brewery.api.config.Configuration; import dev.jsinco.brewery.api.effect.modifier.ModifierManager; import dev.jsinco.brewery.api.event.CustomEventRegistry; import dev.jsinco.brewery.api.event.EventStepRegistry; @@ -66,6 +66,7 @@ import net.kyori.adventure.translation.GlobalTranslator; import org.bukkit.Bukkit; import org.bukkit.NamespacedKey; +import org.bukkit.ServerTickManager; import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.PluginManager; import org.bukkit.plugin.ServicePriority; @@ -382,6 +383,9 @@ private void saveResourceIfNotExists(String resource) { } private void updateStructures(ScheduledTask ignored) { + if (noTicking()) { + return; // Don't tick if the server is frozen, debug purposes + } breweryRegistry.getActiveSinglePositionStructure().stream() .filter(Tickable.class::isInstance) .map(Tickable.class::cast) @@ -395,6 +399,9 @@ private void updateStructures(ScheduledTask ignored) { } private void otherTicking(ScheduledTask ignored) { + if (noTicking()) { + return; // Don't tick if the server is frozen, debug purposes + } drunksManager.tick(drunkEventExecutor::doDrunkEvent, uuid -> Bukkit.getPlayer(uuid) != null); try { if (++time % 200 == 0) { @@ -412,5 +419,11 @@ public static NamespacedKey key(String key) { public Configuration getConfiguration() { return Config.config(); } + + private boolean noTicking() { + ServerTickManager serverTickManager = Bukkit.getServerTickManager(); + return serverTickManager.isFrozen() && !serverTickManager.isSprinting() + && !serverTickManager.isStepping(); + } } diff --git a/bukkit/src/main/java/dev/jsinco/brewery/bukkit/breweries/distillery/BukkitDistillery.java b/bukkit/src/main/java/dev/jsinco/brewery/bukkit/breweries/distillery/BukkitDistillery.java index 19ccd316f..45f49eab6 100644 --- a/bukkit/src/main/java/dev/jsinco/brewery/bukkit/breweries/distillery/BukkitDistillery.java +++ b/bukkit/src/main/java/dev/jsinco/brewery/bukkit/breweries/distillery/BukkitDistillery.java @@ -233,10 +233,14 @@ private List findInSelection(BreweryLocation startingPoint, Vec return output; } - private boolean inventoryUnpopulated() { + private boolean shouldUnpopulateInventory() { return recentlyAccessed == -1L || recentlyAccessed + Moment.SECOND <= TheBrewingProject.getInstance().getTime(); } + private boolean inventoryUnpopulated() { + return recentlyAccessed == -1L; + } + public void tick() { BreweryLocation unique = getStructure().getUnique(); long timeProcessed = getTimeProcessed(); @@ -256,7 +260,8 @@ public void tick() { world, unique.x() + 0.5, unique.y() + 0.5, unique.z() + 0.5 )); } - if (timeProcessed % (processTime / 4) < processTime / 16 && mixture.brewAmount() > processedBrews) { + long particleEffectInterval = Math.max(processTime / 4L, 10L); + if (timeProcessed % particleEffectInterval < 5 && mixture.brewAmount() > processedBrews) { distillateContainerLocations.stream() .map(BukkitAdapter::toLocation) .flatMap(Optional::stream) @@ -267,10 +272,11 @@ public void tick() { public void tickInventory() { checkDirty(); - if (inventoryUnpopulated()) { + if (shouldUnpopulateInventory()) { close(false); TheBrewingProject.getInstance().getBreweryRegistry().unregisterOpened(this); // Distilling results can be computed later on + this.recentlyAccessed = -1L; return; } if (!mixture.getInventory().getViewers().isEmpty() || !distillate.getInventory().getViewers().isEmpty()) { @@ -366,7 +372,11 @@ public void destroy(BreweryLocation breweryLocation) { BukkitAdapter.toLocation(breweryLocation) .map(location -> location.add(0.5, 0, 0.5)) .ifPresent(location -> { + boolean inventoryUnpopulated = inventoryUnpopulated(); for (BrewInventory distilleryInventory : List.of(distillate, mixture)) { + if (!inventoryUnpopulated) { + distilleryInventory.updateBrewsFromInventory(); + } List.copyOf(distilleryInventory.getInventory().getViewers()).forEach(HumanEntity::closeInventory); distilleryInventory.getInventory().clear(); for (Brew brew : distilleryInventory.getBrews()) {