From 3f6bc262cdc461daf0d85368a201d88421d950d6 Mon Sep 17 00:00:00 2001 From: James Seibel Date: Sun, 8 Oct 2023 20:56:48 -0500 Subject: [PATCH] Fix forge (and fabric) not updating LODs when placing/breaking blocks --- .../wrappers/world/ServerLevelWrapper.java | 2 +- .../fabric/FabricClientProxy.java | 9 +-- .../client/MixinClientPacketListener.java | 3 +- .../forge/ForgeClientProxy.java | 58 +++++++++++-------- 4 files changed, 41 insertions(+), 31 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java index 5d354a21c..b6fea22b8 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ServerLevelWrapper.java @@ -140,7 +140,7 @@ public class ServerLevelWrapper implements IServerLevelWrapper public IChunkWrapper tryGetChunk(DhChunkPos pos) { if (!level.hasChunk(pos.x, pos.z)) return null; - ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.EMPTY, false); + ChunkAccess chunk = level.getChunk(pos.x, pos.z, ChunkStatus.FULL, false); if (chunk == null) return null; return new ChunkWrapper(chunk, level, this); } diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java index ed8bf8af3..0bea5de98 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricClientProxy.java @@ -26,6 +26,7 @@ import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.mojang.blaze3d.platform.InputConstants; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.config.Config; import com.seibel.distanthorizons.core.dependencyInjection.ModAccessorInjector; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -117,7 +118,7 @@ public class FabricClientProxy ClientChunkEvents.CHUNK_LOAD.register((level, chunk) -> { IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level); - ClientApi.INSTANCE.clientChunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); + SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); }); // (kinda) block break event @@ -133,7 +134,7 @@ public class FabricClientProxy LOGGER.trace("attack block at blockPos: " + blockPos); IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent( + SharedApi.INSTANCE.chunkBlockChangedEvent( new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel ); @@ -160,7 +161,7 @@ public class FabricClientProxy LOGGER.trace("use block at blockPos: " + hitResult.getBlockPos()); IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent( + SharedApi.INSTANCE.chunkBlockChangedEvent( new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel ); @@ -177,7 +178,7 @@ public class FabricClientProxy ClientChunkEvents.CHUNK_UNLOAD.register((level, chunk) -> { IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper(level); - ClientApi.INSTANCE.clientChunkSaveEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); + SharedApi.INSTANCE.chunkSaveEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); }); diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java index bb18f3744..a38e84d1f 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/mixins/client/MixinClientPacketListener.java @@ -2,6 +2,7 @@ package com.seibel.distanthorizons.fabric.mixins.client; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ClientPacketListener; import org.spongepowered.asm.mixin.Mixin; @@ -57,7 +58,7 @@ public class MixinClientPacketListener void onEnableChunkLight(LevelChunk chunk, int x, int z, CallbackInfo ci) { IClientLevelWrapper clientLevel = ClientLevelWrapper.getWrapper((ClientLevel) chunk.getLevel()); - ClientApi.INSTANCE.clientChunkLoadEvent(new ChunkWrapper(chunk, chunk.getLevel(), clientLevel), clientLevel); + SharedApi.INSTANCE.chunkLoadEvent(new ChunkWrapper(chunk, chunk.getLevel(), clientLevel), clientLevel); } #endif 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 8e4218b87..f82de9e11 100644 --- a/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java +++ b/forge/src/main/java/com/seibel/distanthorizons/forge/ForgeClientProxy.java @@ -20,15 +20,20 @@ package com.seibel.distanthorizons.forge; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.core.api.internal.ClientApi; +import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; +import com.seibel.distanthorizons.core.pos.DhChunkPos; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; //import io.netty.buffer.ByteBuf; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.LevelAccessor; import net.minecraft.client.multiplayer.ClientLevel; @@ -74,7 +79,7 @@ public class ForgeClientProxy #if PRE_MC_1_19_2 private static LevelAccessor GetLevel(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 @@ -164,7 +169,7 @@ public class ForgeClientProxy #endif ChunkAccess chunk = level.getChunk(event.getPos()); - this.onClientBlockChangeEvent(level, chunk); + this.onBlockChangeEvent(level, chunk); } @SubscribeEvent public void leftClickBlockEvent(PlayerInteractEvent.LeftClickBlock event) @@ -178,41 +183,28 @@ public class ForgeClientProxy #endif ChunkAccess chunk = level.getChunk(event.getPos()); - this.onClientBlockChangeEvent(level, chunk); + this.onBlockChangeEvent(level, chunk); } - private void onClientBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) + private void onBlockChangeEvent(LevelAccessor level, ChunkAccess chunk) { - // if we have access to the server, use the chunk save event instead - if (MC.clientConnectedToDedicatedServer()) - { - if (chunk != null) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) level); - ClientApi.INSTANCE.clientChunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); - } - } + ILevelWrapper wrappedLevel = getLevelWrapper(level); + SharedApi.INSTANCE.chunkBlockChangedEvent(new ChunkWrapper(chunk, level, wrappedLevel), wrappedLevel); } @SubscribeEvent public void clientChunkLoadEvent(ChunkEvent.Load event) { - if (GetLevel(event) instanceof ClientLevel) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - ClientApi.INSTANCE.clientChunkLoadEvent(chunk, ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event))); - } + ILevelWrapper wrappedLevel = getLevelWrapper(GetEventLevel(event)); + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel); + SharedApi.INSTANCE.chunkLoadEvent(chunk, wrappedLevel); } @SubscribeEvent public void clientChunkUnloadEvent(ChunkEvent.Unload event) { - if (GetLevel(event) instanceof ClientLevel) - { - IClientLevelWrapper wrappedLevel = ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event)); - IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetLevel(event), wrappedLevel); - ClientApi.INSTANCE.clientChunkSaveEvent(chunk, ClientLevelWrapper.getWrapper((ClientLevel) GetLevel(event))); - } + ILevelWrapper wrappedLevel = getLevelWrapper(GetEventLevel(event)); + IChunkWrapper chunk = new ChunkWrapper(event.getChunk(), GetEventLevel(event), wrappedLevel); + SharedApi.INSTANCE.chunkSaveEvent(chunk, wrappedLevel); } @@ -296,4 +288,20 @@ public class ForgeClientProxy } } + + 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; + } + }