From 390dda94c66524a71617c1142457cecb586d5b66 Mon Sep 17 00:00:00 2001 From: Acuadragon100 <8165958-acuadragon100@users.noreply.gitlab.com> Date: Sat, 25 Apr 2026 20:16:20 +0200 Subject: [PATCH] Fix server loading. --- .../minecraft/MinecraftClientWrapper.java | 39 +++++++++++++++++++ .../minecraft/MinecraftServerWrapper.java | 37 ++++++++++++++++++ .../wrappers/world/ClientLevelWrapper.java | 4 +- coreSubProjects | 2 +- .../fabric/FabricServerProxy.java | 4 +- .../client/MixinClientPacketListener.java | 3 ++ .../neoforge/NeoforgeServerProxy.java | 5 +-- 7 files changed, 87 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java index 3b56dc920..1fd934542 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftClientWrapper.java @@ -24,9 +24,11 @@ import java.io.File; import com.mojang.blaze3d.platform.Window; import com.seibel.distanthorizons.common.wrappers.gui.NativeDialogUtil; import com.seibel.distanthorizons.common.wrappers.world.ClientLevelWrapper; +import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.core.file.structure.ClientOnlySaveStructure; import com.seibel.distanthorizons.core.render.RenderThreadTaskHandler; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; import com.seibel.distanthorizons.coreapi.ModInfo; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper; @@ -43,9 +45,13 @@ import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.client.multiplayer.ServerData; import net.minecraft.client.player.LocalPlayer; import net.minecraft.core.BlockPos; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.server.level.ServerLevel; import net.minecraft.util.profiling.ProfilerFiller; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; #if MC_VER < MC_1_19_2 @@ -62,6 +68,18 @@ import net.minecraft.client.GraphicsStatus; #else #endif +#if MC_VER <= MC_1_21_10 +import net.minecraft.resources.ResourceLocation; +#else +import net.minecraft.resources.Identifier; +#endif + +#if MC_VER > MC_1_19_2 +import net.minecraft.core.registries.Registries; +#else +import net.minecraft.core.Registry; +#endif + /** * A singleton that wraps the Minecraft object. * @@ -434,6 +452,27 @@ public class MinecraftClientWrapper implements IMinecraftClientWrapper, IMinecra } } + @Override + public IServerLevelWrapper getWrappedServerLevel(String levelKey) + { + if (!hasSinglePlayerServer()) return null; + #if MC_VER <= MC_1_21_10 + ResourceLocation levelID = ResourceLocation.tryParse(levelKey); + #else + Identifier levelID = Identifier.tryParse(levelKey); + #endif + if (levelID == null) return null; + + #if MC_VER > MC_1_19_2 + ResourceKey resourceKey = ResourceKey.create(Registries.DIMENSION, levelID); + #else + ResourceKey resourceKey = ResourceKey.create(Registry.DIMENSION_REGISTRY, levelID); + #endif + + ServerLevel level = MINECRAFT.getSingleplayerServer().getLevel(resourceKey); + return ServerLevelWrapper.getWrapper(level); + } + //endregion diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftServerWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftServerWrapper.java index b9adca4ee..4f967be79 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftServerWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/minecraft/MinecraftServerWrapper.java @@ -1,9 +1,26 @@ package com.seibel.distanthorizons.common.wrappers.minecraft; +import com.seibel.distanthorizons.common.wrappers.world.ServerLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper; +import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; +import net.minecraft.resources.ResourceKey; import net.minecraft.server.dedicated.DedicatedServer; +import net.minecraft.server.level.ServerLevel; +import net.minecraft.world.level.Level; import org.jetbrains.annotations.Nullable; +#if MC_VER <= MC_1_21_10 +import net.minecraft.resources.ResourceLocation; +#else +import net.minecraft.resources.Identifier; +#endif + +#if MC_VER > MC_1_19_2 +import net.minecraft.core.registries.Registries; +#else +import net.minecraft.core.Registry; +#endif + import java.io.File; public class MinecraftServerWrapper implements IMinecraftSharedWrapper @@ -59,4 +76,24 @@ public class MinecraftServerWrapper implements IMinecraftSharedWrapper + @Override + public IServerLevelWrapper getWrappedServerLevel(String levelKey) + { + #if MC_VER <= MC_1_21_10 + ResourceLocation levelID = ResourceLocation.tryParse(levelKey); + #else + Identifier levelID = Identifier.tryParse(levelKey); + #endif + if (levelID == null) return null; + + #if MC_VER > MC_1_19_2 + ResourceKey resourceKey = ResourceKey.create(Registries.DIMENSION, levelID); + #else + ResourceKey resourceKey = ResourceKey.create(Registry.DIMENSION_REGISTRY, levelID); + #endif + + ServerLevel level = dedicatedServer.getLevel(resourceKey); + return ServerLevelWrapper.getWrapper(level); + } + } diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java index b2ddaf1f8..067242b78 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/world/ClientLevelWrapper.java @@ -2,12 +2,12 @@ package com.seibel.distanthorizons.common.wrappers.world; import com.seibel.distanthorizons.api.enums.worldGeneration.EDhApiLevelType; import com.seibel.distanthorizons.api.interfaces.render.IDhApiCustomRenderRegister; +import com.seibel.distanthorizons.api.methods.events.abstractEvents.DhApiLevelUnloadEvent; import com.seibel.distanthorizons.common.wrappers.block.BiomeWrapper; import com.seibel.distanthorizons.common.wrappers.block.BlockStateWrapper; import com.seibel.distanthorizons.common.wrappers.block.ClientBlockStateColorCache; import com.seibel.distanthorizons.common.wrappers.chunk.ChunkWrapper; import com.seibel.distanthorizons.common.wrappers.level.KeyedClientLevelManager; -import com.seibel.distanthorizons.core.api.internal.ClientApi; import com.seibel.distanthorizons.core.api.internal.SharedApi; import com.seibel.distanthorizons.core.dataObjects.fullData.sources.FullDataSourceV2; import com.seibel.distanthorizons.core.dependencyInjection.SingletonInjector; @@ -23,6 +23,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IDimensionTypeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; +import com.seibel.distanthorizons.coreapi.DependencyInjection.ApiEventInjector; import net.minecraft.client.Minecraft; import net.minecraft.client.multiplayer.ClientLevel; import net.minecraft.core.BlockPos; @@ -160,6 +161,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper AbstractDhWorld world = SharedApi.getAbstractDhWorld(); if (world != null) { world.unloadLevel(wrapper); + ApiEventInjector.INSTANCE.fireAllEvents(DhApiLevelUnloadEvent.class, new DhApiLevelUnloadEvent.EventParam(wrapper)); } if (wrapper.isDhLevelLoaded()) { wrapper.onUnload(); diff --git a/coreSubProjects b/coreSubProjects index ef3e7763d..da31547cf 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit ef3e7763dc4dd3ab5a2dd982c133ecad4eb4f1f3 +Subproject commit da31547cfcd7e4b76bd78fdbd3c42dfc36c915f8 diff --git a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java index d5bfb41de..1de3e87f9 100644 --- a/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java +++ b/fabric/src/main/java/com/seibel/distanthorizons/fabric/FabricServerProxy.java @@ -114,7 +114,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy ServerLevelEvents.LOAD.register((server, level) -> #endif { - SharedApi.getAbstractDhWorld().getOrLoadLevel(this.getServerLevelWrapper(level)); + ServerApi.INSTANCE.serverLevelLoadEvent(this.getServerLevelWrapper(level)); }); // ServerLevelUnloadEvent @@ -124,7 +124,7 @@ public class FabricServerProxy implements AbstractModInitializer.IEventProxy ServerLevelEvents.UNLOAD.register((server, level) -> #endif { - SharedApi.getAbstractDhWorld().unloadLevel(this.getServerLevelWrapper(level)); + ServerApi.INSTANCE.serverLevelUnloadEvent(this.getServerLevelWrapper(level)); }); // ServerChunkLoadEvent 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 986181457..dd8c8a66f 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 @@ -63,6 +63,9 @@ public class MixinClientPacketListener executor.execute(() -> { + // When Immersive Portals is present we might load a chunk from another level. + // This might cause LODs from another dimension to overwrite the LODs in the current dimension, which is generally undesirable. + if (chunk.getLevel() != this.level) return; IClientLevelWrapper clientLevel = ClientLevelWrapper.getWrapper((ClientLevel) this.level); SharedApi.INSTANCE.applyChunkUpdate(new ChunkWrapper(chunk, clientLevel), clientLevel); }); diff --git a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java index cc611f688..a91dcc863 100644 --- a/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java +++ b/neoforge/src/main/java/com/seibel/distanthorizons/neoforge/NeoforgeServerProxy.java @@ -7,7 +7,6 @@ import com.seibel.distanthorizons.common.wrappers.misc.ServerPlayerWrapper; 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.api.internal.SharedApi; import com.seibel.distanthorizons.core.logging.DhLoggerBuilder; import com.seibel.distanthorizons.core.wrapperInterfaces.chunk.IChunkWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.ILevelWrapper; @@ -88,7 +87,7 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy { if (GetEventLevel(event) instanceof ServerLevel) { - SharedApi.getAbstractDhWorld().getOrLoadLevel(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); + this.serverApi.serverLevelLoadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } } @@ -98,7 +97,7 @@ public class NeoforgeServerProxy implements AbstractModInitializer.IEventProxy { if (GetEventLevel(event) instanceof ServerLevel) { - SharedApi.getAbstractDhWorld().unloadLevel(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); + this.serverApi.serverLevelUnloadEvent(this.getServerLevelWrapper((ServerLevel) GetEventLevel(event))); } }