From 5f025808ab53414c59b6271009a24c4a530edcaa Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sat, 7 Oct 2023 21:29:58 -0500 Subject: [PATCH] Fix singleplayer Forge worlds not updating loaded/saved chunks --- coreSubProjects | 2 +- .../forge/ForgeClientProxy.java | 2 - .../forge/ForgeServerProxy.java | 110 +++++++++--------- 3 files changed, 56 insertions(+), 58 deletions(-) diff --git a/coreSubProjects b/coreSubProjects index 28649f428..f3a83addd 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 28649f42878c305f5661a7712d6aabf89286f90f +Subproject commit f3a83addd40f8b7355eaef5aaa13ee46e6f6c430 diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java index 0b03deb03..8e4218b87 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -182,8 +182,6 @@ public class ForgeClientProxy } private void onClientBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) { - // TODO rate limit this event per blockPos to prevent spam - // if we have access to the server, use the chunk save event instead if (MC.clientConnectedToDedicatedServer()) { diff --git a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java index ec2bb59f8..6fa24e8f5 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeServerProxy.java @@ -1,14 +1,16 @@ package com.seibel.distanthorizons.forge; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; +import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.common.wrappers.worldGeneration.BatchGenerationEnvironment; import com.seibel.distanthorizons.core.api.internal.ServerApi; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; -import net.minecraft.client.Minecraft; -import net.minecraft.client.gui.screens.TitleScreen; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; +import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraftforge.event.TickEvent; #if PRE_MC_1_19_2 @@ -39,9 +41,9 @@ import java.util.function.Supplier; public class ForgeServerProxy { #if PRE_MC_1_19_2 - private static LevelAccessor GetLevel(WorldEvent e) { return e.getWorld(); } + private static LevelAccessor GetEventLevel(WorldEvent e) { return e.getWorld(); } #else - private static LevelAccessor GetLevel(LevelEvent e) { return e.getLevel(); } + private static LevelAccessor GetEventLevel(LevelEvent e) { return e.getLevel(); } #endif private final ServerApi serverApi = ServerApi.INSTANCE; @@ -49,34 +51,30 @@ public class ForgeServerProxy private final boolean isDedicated; public static Supplier isGenerationThreadChecker = null; + + //=============// + // constructor // + //=============// + public ForgeServerProxy(boolean isDedicated) { this.isDedicated = isDedicated; isGenerationThreadChecker = BatchGenerationEnvironment::isCurrentThreadDistantGeneratorThread; } - private boolean isValidTime() - { - if (this.isDedicated) - { - return true; - } - - //FIXME: This may cause init issue... - return !(Minecraft.getInstance().screen instanceof TitleScreen); - } - private ServerLevelWrapper getLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); } + + //========// + // events // + //========// + // ServerTickEvent (at end) @SubscribeEvent public void serverTickEvent(TickEvent.ServerTickEvent event) { if (event.phase == TickEvent.Phase.END) { - if (this.isValidTime()) - { - this.serverApi.serverTickEvent(); - } + this.serverApi.serverTickEvent(); } } @@ -84,20 +82,14 @@ public class ForgeServerProxy @SubscribeEvent public void dedicatedWorldLoadEvent(#if MC_1_16_5 || MC_1_17_1 FMLServerAboutToStartEvent #else ServerAboutToStartEvent #endif event) { - if (this.isValidTime()) - { - this.serverApi.serverLoadEvent(this.isDedicated); - } + this.serverApi.serverLoadEvent(this.isDedicated); } // ServerWorldUnloadEvent @SubscribeEvent public void serverWorldUnloadEvent(#if MC_1_16_5 || MC_1_17_1 FMLServerStoppingEvent #else ServerStoppingEvent #endif event) { - if (this.isValidTime()) - { - this.serverApi.serverUnloadEvent(); - } + this.serverApi.serverUnloadEvent(); } // ServerLevelLoadEvent @@ -108,12 +100,9 @@ public class ForgeServerProxy public void serverLevelLoadEvent(LevelEvent.Load event) #endif { - if (isValidTime()) + if (GetEventLevel(event) instanceof ServerLevel) { - if (GetLevel(event) instanceof ServerLevel) - { - serverApi.serverLevelLoadEvent(getLevelWrapper((ServerLevel) GetLevel(event))); - } + this.serverApi.serverLevelLoadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } } @@ -125,40 +114,51 @@ public class ForgeServerProxy public void serverLevelUnloadEvent(LevelEvent.Unload event) #endif { - if (isValidTime()) + if (GetEventLevel(event) instanceof ServerLevel) { - if (GetLevel(event) instanceof ServerLevel) - { - serverApi.serverLevelUnloadEvent(getLevelWrapper((ServerLevel) GetLevel(event))); - } + this.serverApi.serverLevelUnloadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } } @SubscribeEvent public void serverChunkLoadEvent(ChunkEvent.Load event) { - if (this.isValidTime()) - { - if (GetLevel(event) instanceof ServerLevel) - { - ServerLevelWrapper wrappedLevel = ServerLevelWrapper.getWrapper((ServerLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - this.serverApi.serverChunkLoadEvent(chunk, this.getLevelWrapper((ServerLevel) GetLevel(event))); - } - } + ILevelWrapper levelWrapper = getLevelWrapper(GetEventLevel(event)); + + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper); + this.serverApi.serverChunkLoadEvent(chunk, levelWrapper); } @SubscribeEvent public void serverChunkSaveEvent(ChunkEvent.Unload event) { - if (this.isValidTime()) - { - if (GetLevel(event) instanceof ServerLevel) - { - ServerLevelWrapper wrappedLevel = ServerLevelWrapper.getWrapper((ServerLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - this.serverApi.serverChunkSaveEvent(chunk, this.getLevelWrapper((ServerLevel) GetLevel(event))); - } - } + ILevelWrapper levelWrapper = getLevelWrapper(GetEventLevel(event)); + + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), levelWrapper); + this.serverApi.serverChunkSaveEvent(chunk, levelWrapper); } + + + //================// + // helper methods // + //================// + + private static ServerLevelWrapper getServerLevelWrapper(ServerLevel level) { return ServerLevelWrapper.getWrapper(level); } + + private static ILevelWrapper getLevelWrapper(LevelAccessor level) + { + ILevelWrapper levelWrapper; + if (level instanceof ServerLevel) + { + levelWrapper = ServerLevelWrapper.getWrapper((ServerLevel) level); + } + else + { + levelWrapper = ClientLevelWrapper.getWrapper((ClientLevel) level); + } + + return levelWrapper; + } + + }