Merge branch 'main' of https://gitlab.com/jeseibel/minecraft-lod-mod into feat/server-updates

This commit is contained in:
s809
2023-08-22 19:12:56 +05:00
4 changed files with 104 additions and 135 deletions
@@ -72,7 +72,7 @@ public class ChunkWrapper implements IChunkWrapper
private final byte[] blockLightArray;
private final byte[] skyLightArray;
private LinkedList<DhBlockPos> blockLightPosList = null;
private ArrayList<DhBlockPos> blockLightPosList = null;
private boolean useDhLighting;
@@ -315,7 +315,7 @@ public class ChunkWrapper implements IChunkWrapper
// only populate the list once
if (this.blockLightPosList == null)
{
this.blockLightPosList = new LinkedList<>();
this.blockLightPosList = new ArrayList<>();
#if PRE_MC_1_20_1
@@ -68,28 +68,18 @@ 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
// TODO this assumes only one level per dimension type, the SubDimensionLevelMatcher will need to be added for supporting multiple levels per dimension
ServerLevelWrapper foundLevelWrapper = null;
// TODO: Surely there is a more efficient way to write this code
for (ServerLevel serverLevel : serverLevels)
{
@@ -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();
}
}
@@ -128,30 +110,24 @@ public class ClientLevelWrapper implements IClientLevelWrapper
{
return this.blockMap.getColor(((BlockStateWrapper) blockState).blockState, (BiomeWrapper) biome, pos);
}
@Override
public IDhApiDimensionTypeWrapper getDimensionType() { return DimensionTypeWrapper.getDimensionTypeWrapper(this.level.dimensionType()); }
@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
public boolean hasCeiling() { return this.level.dimensionType().hasCeiling(); }
@Override
public boolean hasSkyLight() { return this.level.dimensionType().hasSkyLight(); }
@Override
public int getHeight() { return this.level.getHeight(); }
@Override
public int getMinHeight()
{
@@ -161,7 +137,7 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return this.level.getMinBuildHeight();
#endif
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
@@ -176,32 +152,33 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return null;
}
return new ChunkWrapper(chunk, this.level, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ)
{
ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{
return new ChunkWrapper(chunk, this.level, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ)
{
ChunkSource source = this.level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{
return BlockStateWrapper.fromBlockState(this.level.getBlockState(McObjectConverter.Convert(pos)), getWrapper(level));
}
@Override
public IBiomeWrapper getBiome(DhBlockPos pos) {
return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this);
}
@Override
public ClientLevel getWrappedMcObject() { return this.level; }
@Override
public String toString()
@Override
public IBiomeWrapper getBiome(DhBlockPos pos) { return BiomeWrapper.getBiomeWrapper(this.level.getBiome(McObjectConverter.Convert(pos)), this); }
@Override
public ClientLevel getWrappedMcObject() { return this.level; }
@Override
public void onUnload() { LEVEL_WRAPPER_BY_CLIENT_LEVEL.remove(this.level); }
@Override
public String toString()
{
if (this.level == null)
{
@@ -210,5 +187,5 @@ public class ClientLevelWrapper implements IClientLevelWrapper
return "Wrapped{" + this.level.toString() + "@" + this.getDimensionType().getDimensionName() + "}";
}
}
@@ -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<>();
private static final ConcurrentHashMap<ServerLevel, ServerLevelWrapper> LEVEL_WRAPPER_BY_SERVER_LEVEL = 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();
}
}
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()
@@ -93,13 +88,13 @@ public class ServerLevelWrapper implements IServerLevelWrapper
return ClientLevelWrapper.getWrapper(client.mc.level);
}
@Override
public File getSaveFolder()
{
return level.getChunkSource().getDataStorage().dataFolder;
}
@Override
public DimensionTypeWrapper getDimensionType()
{
@@ -109,41 +104,29 @@ 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;
}
@Override
public boolean hasCeiling()
{
return level.dimensionType().hasCeiling();
}
@Override
public boolean hasSkyLight()
{
return level.dimensionType().hasSkyLight();
}
@Override
public int getHeight()
{
return level.getHeight();
}
@Override
public int getMinHeight()
{
@@ -152,40 +135,49 @@ public class ServerLevelWrapper implements IServerLevelWrapper
#else
return level.getMinBuildHeight();
#endif
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos) {
if (!level.hasChunk(pos.x, pos.z)) return null;
ChunkAccess chunk = level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
if (chunk == null) return null;
return new ChunkWrapper(chunk, level, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ) {
// world.hasChunk(chunkX, chunkZ); THIS DOES NOT WORK FOR CLIENT LEVEL CAUSE MOJANG ALWAYS RETURN TRUE FOR THAT!
ChunkSource source = level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos) {
return BlockStateWrapper.fromBlockState(level.getBlockState(McObjectConverter.Convert(pos)), getWrapper(level));
}
@Override
public IBiomeWrapper getBiome(DhBlockPos pos) {
return BiomeWrapper.getBiomeWrapper(level.getBiome(McObjectConverter.Convert(pos)), this);
}
@Override
public ServerLevel getWrappedMcObject()
{
return level;
}
@Override
public String toString() {
return "Wrapped{" + level.toString() + "@" + getDimensionType().getDimensionName() + "}";
}
}
@Override
public IChunkWrapper tryGetChunk(DhChunkPos pos)
{
if (!level.hasChunk(pos.x, pos.z)) return null;
ChunkAccess chunk = level.getChunk(pos.getX(), pos.getZ(), ChunkStatus.EMPTY, false);
if (chunk == null) return null;
return new ChunkWrapper(chunk, level, this);
}
@Override
public boolean hasChunkLoaded(int chunkX, int chunkZ)
{
// world.hasChunk(chunkX, chunkZ); THIS DOES NOT WORK FOR CLIENT LEVEL CAUSE MOJANG ALWAYS RETURN TRUE FOR THAT!
ChunkSource source = level.getChunkSource();
return source.hasChunk(chunkX, chunkZ);
}
@Override
public IBlockStateWrapper getBlockState(DhBlockPos pos)
{
return BlockStateWrapper.fromBlockState(level.getBlockState(McObjectConverter.Convert(pos)), getWrapper(level));
}
@Override
public IBiomeWrapper getBiome(DhBlockPos pos)
{
return BiomeWrapper.getBiomeWrapper(level.getBiome(McObjectConverter.Convert(pos)), this);
}
@Override
public ServerLevel getWrappedMcObject()
{
return level;
}
@Override
public void onUnload() { LEVEL_WRAPPER_BY_SERVER_LEVEL.remove(this.level); }
@Override
public String toString()
{
return "Wrapped{" + level.toString() + "@" + getDimensionType().getDimensionName() + "}";
}
}