From 597c71f7895327f01c80f527887ef180e2759497 Mon Sep 17 00:00:00 2001 From: XiaoMoMi <972454774@qq.com> Date: Thu, 23 May 2024 16:41:36 +0800 Subject: [PATCH] Possibly fix entities on 1.18? --- .../world/level/CustomCropsChunk.java | 4 +++ build.gradle.kts | 2 +- .../customcrops/mechanic/world/CChunk.java | 16 ++++++++- .../mechanic/world/WorldManagerImpl.java | 33 ++++++++++++++++++- .../world/adaptor/BukkitWorldAdaptor.java | 7 ++-- .../world/adaptor/SlimeWorldAdaptor.java | 2 +- 6 files changed, 57 insertions(+), 7 deletions(-) diff --git a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java index 97a4e9b..19acd36 100644 --- a/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java +++ b/api/src/main/java/net/momirealms/customcrops/api/mechanic/world/level/CustomCropsChunk.java @@ -331,10 +331,14 @@ public interface CustomCropsChunk { @Nullable CustomCropsSection getSection(int sectionID); + void resetUnloadedSeconds(); + /** * If the chunk can be pruned * * @return can be pruned or not */ boolean canPrune(); + + boolean isOfflineTaskNotified(); } diff --git a/build.gradle.kts b/build.gradle.kts index 91fa0de..072d740 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -8,7 +8,7 @@ plugins { allprojects { project.group = "net.momirealms" - project.version = "3.4.9" + project.version = "3.4.10" apply() apply(plugin = "java") diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java index c05bb4d..a3cf277 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/CChunk.java @@ -51,6 +51,7 @@ public class CChunk implements CustomCropsChunk { private long lastLoadedTime; private int loadedSeconds; private int unloadedSeconds; + private boolean notified; public CChunk(CWorld cWorld, ChunkPos chunkPos) { this.cWorld = cWorld; @@ -60,6 +61,7 @@ public class CChunk implements CustomCropsChunk { this.unloadedSeconds = 0; this.tickedBlocks = Collections.synchronizedSet(new HashSet<>()); this.updateLastLoadedTime(); + this.notified = true; } public CChunk( @@ -88,6 +90,7 @@ public class CChunk implements CustomCropsChunk { @Override public void notifyOfflineUpdates() { + this.notified = true; long current = System.currentTimeMillis(); int offlineTimeInSeconds = (int) (current - this.lastLoadedTime) / 1000; CustomCropsPlugin.get().debug(chunkPos.toString() + " Offline seconds: " + offlineTimeInSeconds + "s."); @@ -595,9 +598,15 @@ public class CChunk implements CustomCropsChunk { this.unloadedSeconds = unloadedSeconds; } + @Override + public void resetUnloadedSeconds() { + this.unloadedSeconds = 0; + this.notified = false; + } + @Override public boolean canPrune() { - return loadedSections.size() == 0; + return loadedSections.isEmpty(); } public PriorityQueue getQueue() { @@ -607,4 +616,9 @@ public class CChunk implements CustomCropsChunk { public Set getTickedBlocks() { return tickedBlocks; } + + @Override + public boolean isOfflineTaskNotified() { + return notified; + } } diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/WorldManagerImpl.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/WorldManagerImpl.java index 9de5ae4..4111ed7 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/WorldManagerImpl.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/WorldManagerImpl.java @@ -39,12 +39,16 @@ import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.EventHandler; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; +import org.bukkit.event.world.ChunkEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.ChunkUnloadEvent; +import org.bukkit.event.world.EntitiesLoadEvent; import org.jetbrains.annotations.NotNull; import java.util.*; +import java.util.concurrent.CompletableFuture; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.TimeUnit; public class WorldManagerImpl implements WorldManager, Listener { @@ -517,9 +521,12 @@ public class WorldManagerImpl implements WorldManager, Listener { } CustomCropsChunk chunk = optionalChunk.get(); + // load the entities if not loaded bukkitChunk.getEntities(); - chunk.notifyOfflineUpdates(); + if (bukkitChunk.isEntitiesLoaded()) { + chunk.notifyOfflineUpdates(); + } } @Override @@ -544,6 +551,30 @@ public class WorldManagerImpl implements WorldManager, Listener { handleChunkUnload(event.getChunk()); } + @EventHandler + public void onEntitiesLoad(EntitiesLoadEvent event) { + + Chunk bukkitChunk = event.getChunk(); + Optional optional = getCustomCropsWorld(bukkitChunk.getWorld()); + if (optional.isEmpty()) + return; + + CustomCropsWorld customCropsWorld = optional.get(); + // offline grow part + if (!customCropsWorld.getWorldSetting().isOfflineTick()) return; + + ChunkPos chunkPos = ChunkPos.getByBukkitChunk(bukkitChunk); + + Optional optionalChunk = customCropsWorld.getLoadedChunkAt(chunkPos); + if (optionalChunk.isEmpty()) { + return; + } + + if (!optionalChunk.get().isOfflineTaskNotified()) { + optionalChunk.get().notifyOfflineUpdates(); + } + } + @Override public void saveChunkToCachedRegion(CustomCropsChunk chunk) { this.worldAdaptor.saveChunkToCachedRegion(chunk); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java index ab29570..2f47476 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/BukkitWorldAdaptor.java @@ -48,6 +48,7 @@ import org.bukkit.NamespacedKey; import org.bukkit.World; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; import org.bukkit.event.world.WorldLoadEvent; import org.bukkit.event.world.WorldSaveEvent; import org.bukkit.event.world.WorldUnloadEvent; @@ -158,7 +159,7 @@ public class BukkitWorldAdaptor extends AbstractWorldAdaptor { CustomCropsChunk lazyChunk = cWorld.removeLazyChunkAt(chunkPos); if (lazyChunk != null) { CChunk cChunk = (CChunk) lazyChunk; - cChunk.setUnloadedSeconds(0); + cChunk.resetUnloadedSeconds(); cWorld.loadChunk(cChunk); long time2 = System.currentTimeMillis(); CustomCropsPlugin.get().debug("Took " + (time2-time1) + "ms to load chunk " + chunkPos + " from lazy chunks"); @@ -264,14 +265,14 @@ public class BukkitWorldAdaptor extends AbstractWorldAdaptor { } } - @EventHandler(ignoreCancelled = true) + @EventHandler(ignoreCancelled = true, priority = EventPriority.HIGH) public void onWorldLoad(WorldLoadEvent event) { if (worldManager.isMechanicEnabled(event.getWorld())) { worldManager.loadWorld(event.getWorld()); } } - @EventHandler (ignoreCancelled = true) + @EventHandler (ignoreCancelled = true, priority = EventPriority.HIGH) public void onWorldUnload(WorldUnloadEvent event) { if (worldManager.isMechanicEnabled(event.getWorld())) worldManager.unloadWorld(event.getWorld()); diff --git a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java index fd9390f..f72ffc0 100644 --- a/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java +++ b/plugin/src/main/java/net/momirealms/customcrops/mechanic/world/adaptor/SlimeWorldAdaptor.java @@ -129,7 +129,7 @@ public class SlimeWorldAdaptor extends BukkitWorldAdaptor { CustomCropsChunk lazyChunk = customCropsWorld.removeLazyChunkAt(chunkPos); if (lazyChunk != null) { CChunk cChunk = (CChunk) lazyChunk; - cChunk.setUnloadedSeconds(0); + cChunk.resetUnloadedSeconds(); cWorld.loadChunk(cChunk); long time2 = System.currentTimeMillis(); CustomCropsPlugin.get().debug("Took " + (time2-time1) + "ms to load chunk " + chunkPos + " from lazy chunks");