Fix LevelWrappers not unloading correctly

This commit is contained in:
James Seibel
2023-08-20 14:47:36 -05:00
parent 87fec5276d
commit 50e9a51f56
3 changed files with 23 additions and 58 deletions
@@ -68,22 +68,12 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return LEVEL_WRAPPER_BY_CLIENT_LEVEL.computeIfAbsent(level, ClientLevelWrapper::new);
}
public static void closeLevel(ClientLevel level) { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(level); }
@Nullable
@Override
public IServerLevelWrapper tryGetServerSideWrapper()
{
try
{
// commented out because this breaks when traveling between dimensions,
// serverPlayer.getLevel() will return the previously loaded level, which causes issues
// PlayerList serverPlayerList = MinecraftClientWrapper.INSTANCE.mc.getSingleplayerServer().getPlayerList();
// ServerPlayer serverPlayer = serverPlayerList.getPlayer(MinecraftClientWrapper.INSTANCE.mc.player.getUUID());
// return ServerLevelWrapper.getWrapper(serverPlayer.getLevel());
Iterable<ServerLevel> serverLevels = MinecraftClientWrapper.INSTANCE.mc.getSingleplayerServer().getAllLevels();
// attempt to find the server level with the same dimension type
@@ -108,14 +98,6 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return null;
}
}
public static void cleanCheck()
{
if (!LEVEL_WRAPPER_BY_CLIENT_LEVEL.isEmpty())
{
LOGGER.warn("{} client levels havn't been freed!", LEVEL_WRAPPER_BY_CLIENT_LEVEL.size());
LEVEL_WRAPPER_BY_CLIENT_LEVEL.clear();
}
}
@@ -135,12 +117,6 @@ public class ClientLevelWrapper implements IClientLevelWrapper
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.CLIENT_LEVEL; }
@Override
public int getBlockLight(int x, int y, int z) { return this.level.getBrightness(LightLayer.BLOCK, new BlockPos(x, y, z)); }
@Override
public int getSkyLight(int x, int y, int z) { return this.level.getBrightness(LightLayer.SKY, new BlockPos(x, y, z)); }
public ClientLevel getLevel() { return this.level; }
@Override
@@ -198,6 +174,9 @@ public class ClientLevelWrapper implements IClientLevelWrapper
@Override
public ClientLevel getWrappedMcObject() { return this.level; }
@Override
public void onUnload() { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level); }
@Override
public String toString()
{
@@ -38,9 +38,7 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper;
import net.minecraft.core.BlockPos;
import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.level.LightLayer;
import net.minecraft.world.level.chunk.ChunkAccess;
import net.minecraft.world.level.chunk.ChunkSource;
import net.minecraft.world.level.chunk.ChunkStatus;
@@ -54,33 +52,30 @@ import org.jetbrains.annotations.Nullable;
public class ServerLevelWrapper implements IServerLevelWrapper
{
private static final Logger LOGGER = DhLoggerBuilder.getLogger();
private static final ConcurrentHashMap<ServerLevel, ServerLevelWrapper>
levelWrapperMap = new ConcurrentHashMap<>();
public static ServerLevelWrapper getWrapper(ServerLevel level)
{
return levelWrapperMap.computeIfAbsent(level, ServerLevelWrapper::new);
}
public static void closeWrapper(ServerLevel level)
{
levelWrapperMap.remove(level);
}
public static void cleanCheck()
{
if (!levelWrapperMap.isEmpty())
{
LOGGER.warn(levelWrapperMap.size() + " server levels haven't been freed!");
levelWrapperMap.clear();
}
}
private static final ConcurrentHashMap<ServerLevel, ServerLevelWrapper> LEVEL_WRAPPER_BY_SERVER_LEVEL = new ConcurrentHashMap<>();
final ServerLevel level;
ServerBlockDetailMap blockMap = new ServerBlockDetailMap(this);
//==============//
// constructors //
//==============//
public static ServerLevelWrapper getWrapper(ServerLevel level) { return LEVEL_WRAPPER_BY_SERVER_LEVEL.computeIfAbsent(level, ServerLevelWrapper::new); }
public ServerLevelWrapper(ServerLevel level)
{
this.level = level;
}
//=========//
// methods //
//=========//
@Nullable
@Override
public IClientLevelWrapper tryGetClientLevelWrapper()
@@ -109,18 +104,6 @@ public class ServerLevelWrapper implements IServerLevelWrapper
@Override
public EDhApiLevelType getLevelType() { return EDhApiLevelType.SERVER_LEVEL; }
@Override
public int getBlockLight(int x, int y, int z)
{
return level.getBrightness(LightLayer.BLOCK, new BlockPos(x, y, z));
}
@Override
public int getSkyLight(int x, int y, int z)
{
return level.getBrightness(LightLayer.SKY, new BlockPos(x, y, z));
}
public ServerLevel getLevel()
{
return level;
@@ -188,6 +171,9 @@ public class ServerLevelWrapper implements IServerLevelWrapper
return level;
}
@Override
public void onUnload() { LEVEL_WRAPPER_BY_SERVER_LEVEL.remove(this.level); }
@Override
public String toString()
{