Fix server loading.

This commit is contained in:
Acuadragon100
2026-04-25 20:16:20 +02:00
parent 6600703d52
commit 390dda94c6
7 changed files with 87 additions and 7 deletions
@@ -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<Level> resourceKey = ResourceKey.create(Registries.DIMENSION, levelID);
#else
ResourceKey<Level> resourceKey = ResourceKey.create(Registry.DIMENSION_REGISTRY, levelID);
#endif
ServerLevel level = MINECRAFT.getSingleplayerServer().getLevel(resourceKey);
return ServerLevelWrapper.getWrapper(level);
}
//endregion
@@ -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<Level> resourceKey = ResourceKey.create(Registries.DIMENSION, levelID);
#else
ResourceKey<Level> resourceKey = ResourceKey.create(Registry.DIMENSION_REGISTRY, levelID);
#endif
ServerLevel level = dedicatedServer.getLevel(resourceKey);
return ServerLevelWrapper.getWrapper(level);
}
}
@@ -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();
@@ -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
@@ -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);
});
@@ -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)));
}
}