diff --git a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java index 220769b0d..c184a959e 100644 --- a/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java +++ b/common/src/main/java/com/seibel/distanthorizons/common/wrappers/chunk/ChunkWrapper.java @@ -72,7 +72,7 @@ public class ChunkWrapper implements IChunkWrapper private final byte[] blockLightArray; private final byte[] skyLightArray; - private LinkedList blockLightPosList = null; + private ArrayList 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 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 97cfd21c6..5f67a8d75 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 @@ -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 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() + "}"; } - + } 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 101322a12..b10dcdc50 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 @@ -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 - levelWrapperMap = new ConcurrentHashMap<>(); + private static final ConcurrentHashMap 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() + "}"; + } + } diff --git a/coreSubProjects b/coreSubProjects index 627bfbc00..52a90fec6 160000 --- a/coreSubProjects +++ b/coreSubProjects @@ -1 +1 @@ -Subproject commit 627bfbc0074c85f10339e7a0dfec4f68c2368591 +Subproject commit 52a90fec6c320cc6580a82a2affb27265fe8e5de