Fix forge wrong proxies, fix generator shutdown, fix batch gen incorrect timeout,

This commit is contained in:
TomTheFurry
2022-07-30 00:11:25 +08:00
parent 2e833136f6
commit 823da76896
25 changed files with 192 additions and 193 deletions
@@ -38,6 +38,8 @@ public interface LodRenderSource {
byte getRenderVersion();
void markInvalid();
/**
* Whether this object is still valid. If not, a new one should be created.
*/
@@ -56,6 +56,7 @@ public class PlaceHolderRenderSource implements LodRenderSource {
return 0;
}
@Override
public void markInvalid() {
isValid = false;
}
@@ -316,6 +316,9 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
@Override
public void update(ChunkSizedData chunkData) {
//TODO Update render data directly
//TEMP DEUBG
isValid = false;
}
@Override
@@ -323,8 +326,14 @@ public class ColumnRenderSource implements LodRenderSource, IColumnDatatype {
return LATEST_VERSION;
}
private boolean isValid = true;
@Override
public void markInvalid() {
isValid = false;
}
@Override
public boolean isValid() {
return true; // For now, this is always valid.
return isValid;
}
}
@@ -190,6 +190,9 @@ public class ColumnRenderBuffer extends RenderBuffer {
LodQuadBuilder builder = new LodQuadBuilder(true,
(short) (skyLightCullingBelow - clientLevel.getMinY()));
makeLodRenderData(builder, data, adjData);
if (builder.getCurrentQuadsCount() > 0) {
LOGGER.info("her");
}
EVENT_LOGGER.trace("RenderRegion end QuadBuild @ {}", data.sectionPos);
return builder;
} catch (UncheckedInterruptedException e) {
@@ -11,6 +11,7 @@ import com.seibel.lod.core.a7.level.IClientLevel;
import com.seibel.lod.core.a7.pos.DhSectionPos;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.wrapperInterfaces.IWrapperFactory;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper;
@@ -31,11 +32,13 @@ public class FullToColumnTransformer {
final ColumnRenderSource columnSource = new ColumnRenderSource(pos, vertSize, level.getMinY());
if (dataDetail == columnSource.getDataDetail()) {
int baseX = pos.getCorner().getCorner().x;
int baseZ = pos.getCorner().getCorner().z;
for (int x = 0; x < pos.getWidth(dataDetail).value; x++) {
for (int z = 0; z < pos.getWidth(dataDetail).value; z++) {
ColumnArrayView columnArrayView = columnSource.getVerticalDataView(x, z);
SingleFullArrayView fullArrayView = data.get(x, z);
convertColumnData(level, columnArrayView, fullArrayView);
convertColumnData(level, baseX + x, baseZ + z, columnArrayView, fullArrayView);
}
}
// } else if (dataDetail == 0 && columnSource.getDataDetail() > dataDetail) {
@@ -60,7 +63,7 @@ public class FullToColumnTransformer {
return columnSource;
}
private static void convertColumnData(IClientLevel level, ColumnArrayView columnArrayView, SingleFullArrayView fullArrayView) {
private static void convertColumnData(IClientLevel level, int blockX, int blockZ, ColumnArrayView columnArrayView, SingleFullArrayView fullArrayView) {
if (!fullArrayView.doesItExist()) return;
// TODO: Set gen mode
int genModeValue = 1;
@@ -69,14 +72,14 @@ public class FullToColumnTransformer {
if (dataTotalLength > columnArrayView.verticalSize()) {
ColumnArrayView totalColumnData = new ColumnArrayView(new long[dataTotalLength], dataTotalLength, 0, dataTotalLength);
iterateAndConvert(level, genModeValue, totalColumnData, fullArrayView);
iterateAndConvert(level, blockX, blockZ, genModeValue, totalColumnData, fullArrayView);
columnArrayView.changeVerticalSizeFrom(totalColumnData);
} else {
iterateAndConvert(level, genModeValue, columnArrayView, fullArrayView); //Directly use the arrayView since it fits.
iterateAndConvert(level, blockX, blockZ, genModeValue, columnArrayView, fullArrayView); //Directly use the arrayView since it fits.
}
}
private static void iterateAndConvert(IClientLevel level, int genMode, ColumnArrayView column, SingleFullArrayView data) {
private static void iterateAndConvert(IClientLevel level, int blockX, int blockZ, int genMode, ColumnArrayView column, SingleFullArrayView data) {
IdBiomeBlockStateMap mapping = data.getMapping();
boolean isVoid = true;
for (int i = 0; i < data.getSingleLength(); i++) {
@@ -90,7 +93,7 @@ public class FullToColumnTransformer {
IBlockStateWrapper block = entry.blockState;
if (block.equals(AIR)) continue;
isVoid = false;
int color = level.computeBaseColor(biome, block);
int color = level.computeBaseColor(new DHBlockPos(blockX, y + level.getMinY(), blockZ), biome, block);
long columnData = ColumnFormat.createDataPoint(y + blockLength, y, color, light, genMode);
column.set(i, columnData);
}
@@ -7,6 +7,7 @@ import com.seibel.lod.core.a7.datatype.full.FullDataSource;
import com.seibel.lod.core.a7.pos.DhBlockPos2D;
import com.seibel.lod.core.a7.pos.DhLodPos;
import com.seibel.lod.core.a7.pos.DhSectionPos;
import com.seibel.lod.core.a7.util.UncheckedInterruptedException;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.DHChunkPos;
import com.seibel.lod.core.util.LodUtil;
@@ -122,6 +123,8 @@ public class GenerationQueue implements PlaceHolderQueue {
if (ex instanceof CompletionException) {
ex = ex.getCause();
}
if (ex instanceof InterruptedException) return; // Ignore interrupted exceptions.
if (ex instanceof UncheckedInterruptedException) return; // Ignore unchecked interrupted exceptions.
logger.error("Error generating data for section {}", pos, ex);
return;
}
@@ -164,6 +167,11 @@ public class GenerationQueue implements PlaceHolderQueue {
// }
// }
}).exceptionally(ex -> {
if (ex instanceof CompletionException) {
ex = ex.getCause();
}
if (ex instanceof InterruptedException) return null; // Ignore interrupted exceptions.
if (ex instanceof UncheckedInterruptedException) return null; // Ignore unchecked interrupted exceptions.
logger.error("Error generating data for {} by {} chunks (at {}) with data detail {}",
perCallChunksWidth, perCallChunksWidth, subCallChunkPosMin, dataDetail, ex);
return null;
@@ -10,12 +10,14 @@ import com.seibel.lod.core.a7.save.structure.ClientOnlySaveStructure;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.objects.math.Mat4f;
import com.seibel.lod.core.a7.render.a7LodRenderer;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import org.apache.logging.log4j.Logger;
@@ -28,11 +30,11 @@ public class DhClientLevel implements IClientLevel {
public final RemoteDataFileHandler dataFileHandler;
public final RenderFileHandler renderFileHandler;
public final RenderBufferHandler renderBufferHandler; //TODO: Should this be owned by renderer?
public final ILevelWrapper level;
public final IClientLevelWrapper level;
public a7LodRenderer renderer = null;
public LodQuadTree tree;
public DhClientLevel(ClientOnlySaveStructure save, ILevelWrapper level) {
public DhClientLevel(ClientOnlySaveStructure save, IClientLevelWrapper level) {
this.save = save;
save.getDataFolder(level).mkdirs();
save.getRenderCacheFolder(level).mkdirs();
@@ -51,11 +53,6 @@ public class DhClientLevel implements IClientLevel {
//TODO
}
@Override
public ILevelWrapper getLevelWrapper() {
return level;
}
@Override
public void clientTick() {
tree.tick(new DhBlockPos2D(MC_CLIENT.getPlayerBlockPos()));
@@ -76,10 +73,15 @@ public class DhClientLevel implements IClientLevel {
}
@Override
public int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block) {
public int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) {
return 0; //TODO
}
@Override
public IClientLevelWrapper getClientLevelWrapper() {
return level;
}
@Override
public int getMinY() {
return level.getMinHeight();
@@ -13,13 +13,16 @@ import com.seibel.lod.core.builders.worldGeneration.BatchGenerator;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.objects.math.Mat4f;
import com.seibel.lod.core.a7.render.a7LodRenderer;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.CompletableFuture;
@@ -32,17 +35,19 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
public GenerationQueue generationQueue = null;
public RenderFileHandler renderFileHandler = null;
public RenderBufferHandler renderBufferHandler = null; //TODO: Should this be owned by renderer?
public final ILevelWrapper level;
public final IServerLevelWrapper serverLevel;
public IClientLevelWrapper clientLevel;
public a7LodRenderer renderer = null;
public LodQuadTree tree = null;
public IGenerator worldGenerator = null;
public DhClientServerLevel(LocalSaveStructure save, ILevelWrapper level) {
this.level = level;
public DhClientServerLevel(LocalSaveStructure save, IServerLevelWrapper level) {
this.serverLevel = level;
this.save = save;
save.getDataFolder(level).mkdirs();
save.getRenderCacheFolder(level).mkdirs();
dataFileHandler = new LocalDataFileHandler(this, save.getDataFolder(level));
FileScanner.scanFile(save, serverLevel, dataFileHandler, null);
LOGGER.info("Started DHLevel for {} with saves at {}", level, save);
}
@@ -57,15 +62,16 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
public void serverTick() {
//TODO Update network packet and stuff or state or etc..
}
public void startRenderer() {
LOGGER.info("Starting renderer for {}", level);
if (renderBufferHandler != null) {
LOGGER.warn("Tried to call startRenderer() on the clientServerLevel {} when renderer is already setup!", level);
public void startRenderer(IClientLevelWrapper clientLevel) {
LOGGER.info("Starting renderer for {}", this);
if (renderBufferHandler != null || this.clientLevel != null) {
LOGGER.warn("Tried to call startRenderer() on {} when renderer is already setup!", this);
return;
}
this.clientLevel = clientLevel;
// FIXME: This A need B and B need A messes needs to be reworked!
renderFileHandler = new RenderFileHandler(dataFileHandler, this, save.getRenderCacheFolder(level));
renderFileHandler = new RenderFileHandler(dataFileHandler, this, save.getRenderCacheFolder(serverLevel));
final RenderFileHandler f_renderFileHandler = renderFileHandler;
generationQueue = new GenerationQueue(f_renderFileHandler::write);
renderFileHandler.setPlaceHolderQueue(generationQueue);
@@ -73,13 +79,13 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
tree = new LodQuadTree(this, Config.Client.Graphics.Quality.lodChunkRenderDistance.get()*16,
MC_CLIENT.getPlayerBlockPos().x, MC_CLIENT.getPlayerBlockPos().z, renderFileHandler);
renderBufferHandler = new RenderBufferHandler(tree);
FileScanner.scanFile(save, level, dataFileHandler, renderFileHandler);
FileScanner.scanFile(save, serverLevel, null, renderFileHandler);
}
@Override
public void render(Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks, IProfilerWrapper profiler) {
if (renderBufferHandler == null) {
LOGGER.error("Tried to call render() on the clientServerLevel {} when renderer has not been started!", level);
LOGGER.error("Tried to call render() on {} when renderer has not been started!", this);
return;
}
if (renderer == null) {
@@ -89,9 +95,9 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
}
public void stopRenderer() {
LOGGER.info("Stopping renderer for {}", level);
LOGGER.info("Stopping renderer for {}", this);
if (renderBufferHandler == null) {
LOGGER.warn("Tried to call stopRenderer() on the clientServerLevel {} when renderer is already closed!", level);
LOGGER.warn("Tried to call stopRenderer() on {} when renderer is already closed!", this);
return;
}
renderBufferHandler.close();
@@ -109,8 +115,13 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
}
@Override
public int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block) {
return 0; //TODO
public int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block) {
return clientLevel.computeBaseColor(pos, biome, block);
}
@Override
public IClientLevelWrapper getClientLevelWrapper() {
return clientLevel;
}
@Override
@@ -120,7 +131,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
@Override
public int getMinY() {
return level.getMinHeight();
return serverLevel.getMinHeight();
}
@Override
@@ -137,7 +148,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
if (renderBufferHandler != null) renderBufferHandler.close();
if (renderFileHandler != null) renderFileHandler.close();
dataFileHandler.close();
LOGGER.info("Closed DHLevel for {}", level);
LOGGER.info("Closed {}", this);
}
@@ -155,7 +166,7 @@ public class DhClientServerLevel implements IClientLevel, IServerLevel {
}
@Override
public ILevelWrapper getLevelWrapper() {
return level;
public IServerLevelWrapper getServerLevelWrapper() {
return serverLevel;
}
}
@@ -9,6 +9,7 @@ import com.seibel.lod.core.a7.save.structure.LocalSaveStructure;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.objects.DHChunkPos;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import org.apache.logging.log4j.Logger;
import java.util.concurrent.CompletableFuture;
@@ -18,9 +19,9 @@ public class DhServerLevel implements IServerLevel {
public final LocalSaveStructure save;
public final LocalDataFileHandler dataFileHandler;
public final ILevelWrapper level;
public final IServerLevelWrapper level;
public DhServerLevel(LocalSaveStructure save, ILevelWrapper level) {
public DhServerLevel(LocalSaveStructure save, IServerLevelWrapper level) {
this.save = save;
this.level = level;
save.getDataFolder(level).mkdirs();
@@ -58,7 +59,7 @@ public class DhServerLevel implements IServerLevel {
}
@Override
public ILevelWrapper getLevelWrapper() {
public IServerLevelWrapper getServerLevelWrapper() {
return level;
}
}
@@ -1,10 +1,12 @@
package com.seibel.lod.core.a7.level;
import com.seibel.lod.core.a7.render.RenderBufferHandler;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.objects.math.Mat4f;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IBiomeWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
public interface IClientLevel extends ILevel {
void clientTick();
@@ -13,5 +15,7 @@ public interface IClientLevel extends ILevel {
RenderBufferHandler getRenderBufferHandler();
int computeBaseColor(IBiomeWrapper biome, IBlockStateWrapper block);
int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper block);
IClientLevelWrapper getClientLevelWrapper();
}
@@ -9,6 +9,4 @@ public interface ILevel extends AutoCloseable {
CompletableFuture<Void> save();
void dumpRamUsage();
ILevelWrapper getLevelWrapper();
}
@@ -1,8 +1,10 @@
package com.seibel.lod.core.a7.level;
import com.seibel.lod.core.a7.datatype.full.ChunkSizedData;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
public interface IServerLevel extends ILevel {
void serverTick();
void doWorldGen();
IServerLevelWrapper getServerLevelWrapper();
}
@@ -3,6 +3,7 @@ package com.seibel.lod.core.a7.save.structure;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftSharedWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import java.io.File;
@@ -17,20 +18,23 @@ public class LocalSaveStructure extends SaveStructure {
@Override
public File tryGetLevelFolder(ILevelWrapper wrapper) {
debugPath = new File(wrapper.getSaveFolder(), "Distant_Horizons");
return new File(wrapper.getSaveFolder(), "Distant_Horizons");
IServerLevelWrapper serverSide = (IServerLevelWrapper) wrapper;
debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons");
return new File(serverSide.getSaveFolder(), "Distant_Horizons");
}
@Override
public File getRenderCacheFolder(ILevelWrapper level) {
debugPath = new File(level.getSaveFolder(), "Distant_Horizons");
return new File(new File(level.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER);
IServerLevelWrapper serverSide = (IServerLevelWrapper) level;
debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons");
return new File(new File(serverSide.getSaveFolder(), "Distant_Horizons"), RENDER_CACHE_FOLDER);
}
@Override
public File getDataFolder(ILevelWrapper level) {
debugPath = new File(level.getSaveFolder(), "Distant_Horizons");
return new File(new File(level.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER);
IServerLevelWrapper serverSide = (IServerLevelWrapper) level;
debugPath = new File(serverSide.getSaveFolder(), "Distant_Horizons");
return new File(new File(serverSide.getSaveFolder(), "Distant_Horizons"), DATA_FOLDER);
}
@Override
@@ -5,7 +5,9 @@ import com.seibel.lod.core.a7.save.structure.LocalSaveStructure;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.util.EventLoop;
import com.seibel.lod.core.util.LodUtil;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import java.io.File;
import java.util.HashMap;
@@ -29,11 +31,23 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe
@Override
public DhClientServerLevel getOrLoadLevel(ILevelWrapper wrapper) {
return levels.computeIfAbsent(wrapper, (w) -> {
File levelFile = saveStructure.tryGetLevelFolder(w);
LodUtil.assertTrue(levelFile != null);
return new DhClientServerLevel(saveStructure, w);
});
if (wrapper instanceof IServerLevelWrapper) {
return levels.computeIfAbsent(wrapper, (w) -> {
File levelFile = saveStructure.tryGetLevelFolder(w);
LodUtil.assertTrue(levelFile != null);
return new DhClientServerLevel(saveStructure, (IServerLevelWrapper) w);
});
} else {
return levels.computeIfAbsent(wrapper, (w) -> {
IClientLevelWrapper clientSide = (IClientLevelWrapper) w;
IServerLevelWrapper serverSide = clientSide.tryGetServerSideWrapper();
LodUtil.assertTrue(serverSide != null);
DhClientServerLevel level = levels.get(serverSide);
if (level==null) return null;
level.startRenderer(clientSide);
return level;
});
}
}
@Override
@@ -44,8 +58,12 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe
@Override
public void unloadLevel(ILevelWrapper wrapper) {
if (levels.containsKey(wrapper)) {
LOGGER.info("Unloading level {} ", levels.get(wrapper));
levels.remove(wrapper).close();
if (wrapper instanceof IServerLevelWrapper) {
LOGGER.info("Unloading level {} ", levels.get(wrapper));
levels.remove(wrapper).close();
} else {
levels.remove(wrapper).stopRenderer(); // Ignore resource warning. The level obj is referenced elsewhere.
}
}
}
@@ -85,21 +103,11 @@ public class DhClientServerWorld extends DhWorld implements IClientWorld, IServe
public void close() {
saveAndFlush().join();
for (DhClientServerLevel level : levels.values()) {
LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + level.serverLevel.getDimensionType().getDimensionName());
level.close();
}
levels.clear();
LOGGER.info("Closed DhWorld of type {}", environment);
}
public void enableRendering(ILevelWrapper wrapper) {
DhClientServerLevel level = levels.get(wrapper);
if (level==null) return;
level.startRenderer();
}
public void disableRendering(ILevelWrapper wrapper) {
DhClientServerLevel level = levels.get(wrapper);
if (level==null) return;
level.stopRenderer();
}
}
@@ -7,6 +7,7 @@ import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.util.DetailDistanceUtil;
import com.seibel.lod.core.util.EventLoop;
import com.seibel.lod.core.util.LodUtil;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import java.io.File;
@@ -16,7 +17,7 @@ import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutorService;
public class DhClientWorld extends DhWorld implements IClientWorld {
private final HashMap<ILevelWrapper, DhClientLevel> levels;
private final HashMap<IClientLevelWrapper, DhClientLevel> levels;
public final ClientOnlySaveStructure saveStructure;
public ExecutorService dhTickerThread = LodUtil.makeSingleThreadPool("DHTickerThread", 2);
public EventLoop eventLoop = new EventLoop(dhTickerThread, this::_clientTick);
@@ -30,7 +31,9 @@ public class DhClientWorld extends DhWorld implements IClientWorld {
@Override
public DhClientLevel getOrLoadLevel(ILevelWrapper wrapper) {
return levels.computeIfAbsent(wrapper, (w) -> {
if (!(wrapper instanceof IClientLevelWrapper)) return null;
return levels.computeIfAbsent((IClientLevelWrapper) wrapper, (w) -> {
File level = saveStructure.tryGetLevelFolder(wrapper);
if (level == null) return null;
return new DhClientLevel(saveStructure, w);
@@ -39,11 +42,13 @@ public class DhClientWorld extends DhWorld implements IClientWorld {
@Override
public DhClientLevel getLevel(ILevelWrapper wrapper) {
if (!(wrapper instanceof IClientLevelWrapper)) return null;
return levels.get(wrapper);
}
@Override
public void unloadLevel(ILevelWrapper wrapper) {
if (!(wrapper instanceof IClientLevelWrapper)) return;
if (levels.containsKey(wrapper)) {
LOGGER.info("Unloading level {} ", levels.get(wrapper));
levels.remove(wrapper).close();
@@ -77,7 +82,7 @@ public class DhClientWorld extends DhWorld implements IClientWorld {
public void close() {
saveAndFlush().join();
for (DhClientLevel level : levels.values()) {
LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + level.level.getDimensionType().getDimensionName());
level.close();
}
levels.clear();
@@ -4,13 +4,14 @@ import com.seibel.lod.core.a7.level.DhServerLevel;
import com.seibel.lod.core.a7.save.structure.LocalSaveStructure;
import com.seibel.lod.core.util.LodUtil;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import java.io.File;
import java.util.HashMap;
import java.util.concurrent.CompletableFuture;
public class DhServerWorld extends DhWorld implements IServerWorld {
private final HashMap<ILevelWrapper, DhServerLevel> levels;
private final HashMap<IServerLevelWrapper, DhServerLevel> levels;
public final LocalSaveStructure saveStructure;
public DhServerWorld() {
@@ -22,7 +23,8 @@ public class DhServerWorld extends DhWorld implements IServerWorld {
@Override
public DhServerLevel getOrLoadLevel(ILevelWrapper wrapper) {
return levels.computeIfAbsent(wrapper, (w) -> {
if (!(wrapper instanceof IServerLevelWrapper)) return null;
return levels.computeIfAbsent((IServerLevelWrapper) wrapper, (w) -> {
File levelFile = saveStructure.tryGetLevelFolder(wrapper);
LodUtil.assertTrue(levelFile != null);
return new DhServerLevel(saveStructure, w);
@@ -31,11 +33,13 @@ public class DhServerWorld extends DhWorld implements IServerWorld {
@Override
public DhServerLevel getLevel(ILevelWrapper wrapper) {
if (!(wrapper instanceof IServerLevelWrapper)) return null;
return levels.get(wrapper);
}
@Override
public void unloadLevel(ILevelWrapper wrapper) {
if (!(wrapper instanceof IServerLevelWrapper)) return;
if (levels.containsKey(wrapper)) {
LOGGER.info("Unloading level {} ", levels.get(wrapper));
levels.remove(wrapper).close();
@@ -59,7 +63,7 @@ public class DhServerWorld extends DhWorld implements IServerWorld {
@Override
public void close() {
for (DhServerLevel level : levels.values()) {
LOGGER.info("Unloading level for world " + level.level.getDimensionType().getDimensionName());
LOGGER.info("Unloading level " + level.level.getDimensionType().getDimensionName());
level.close();
}
levels.clear();
@@ -36,6 +36,7 @@ import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftClientWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IMinecraftRenderWrapper;
import com.seibel.lod.core.wrapperInterfaces.minecraft.IProfilerWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IClientLevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.LogManager;
@@ -118,35 +119,31 @@ public class ClientApi
SharedApi.currentWorld = null;
}
public void clientChunkLoadEvent(IChunkWrapper chunk, ILevelWrapper level)
public void clientChunkLoadEvent(IChunkWrapper chunk, IClientLevelWrapper level)
{
if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) {
//TODO: Implement
}
}
public void clientChunkSaveEvent(IChunkWrapper chunk, ILevelWrapper level)
public void clientChunkSaveEvent(IChunkWrapper chunk, IClientLevelWrapper level)
{
if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) {
//TODO: Implement
}
}
public void clientLevelUnloadEvent(ILevelWrapper level)
public void clientLevelUnloadEvent(IClientLevelWrapper level)
{
if (ENABLE_EVENT_LOGGING) LOGGER.info("Client level {} unloading.", level);
if (SharedApi.currentWorld instanceof DhClientServerWorld) {
((DhClientServerWorld)SharedApi.currentWorld).disableRendering(level);
} else if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) {
if (SharedApi.currentWorld != null) {
SharedApi.currentWorld.unloadLevel(level);
}
}
public void clientLevelLoadEvent(ILevelWrapper level)
public void clientLevelLoadEvent(IClientLevelWrapper level)
{
if (ENABLE_EVENT_LOGGING) LOGGER.info("Client level {} loading.", level);
if (SharedApi.currentWorld instanceof DhClientServerWorld) {
((DhClientServerWorld)SharedApi.currentWorld).enableRendering(level);
} else if (SharedApi.getEnvironment() == WorldEnvironment.Client_Only) {
SharedApi.currentWorld.getOrLoadLevel(level); //TODO: This may need to be delayed to after player enters the level
if (SharedApi.currentWorld != null) {
SharedApi.currentWorld.getOrLoadLevel(level);
}
}
@@ -186,7 +183,7 @@ public class ClientApi
profiler.pop();
}
public void renderLods(ILevelWrapper levelWrapper, Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks)
public void renderLods(IClientLevelWrapper levelWrapper, Mat4f mcModelViewMatrix, Mat4f mcProjectionMatrix, float partialTicks)
{
IProfilerWrapper profiler = MC.getProfiler();
profiler.pop(); // get out of "terrain"
@@ -23,10 +23,12 @@ import com.seibel.lod.core.a7.world.DhClientServerWorld;
import com.seibel.lod.core.a7.world.DhServerWorld;
import com.seibel.lod.core.a7.world.IServerWorld;
import com.seibel.lod.core.handlers.dependencyInjection.SingletonInjector;
import com.seibel.lod.core.logging.ConfigBasedLogger;
import com.seibel.lod.core.logging.DhLoggerBuilder;
import com.seibel.lod.core.wrapperInterfaces.IVersionConstants;
import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.ILevelWrapper;
import com.seibel.lod.core.wrapperInterfaces.world.IServerLevelWrapper;
import org.apache.logging.log4j.Logger;
import java.lang.invoke.MethodHandles;
@@ -42,7 +44,7 @@ public class ServerApi
{
public static final boolean ENABLE_STACK_DUMP_LOGGING = false;
public static final ServerApi INSTANCE = new ServerApi();
private static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
public static final Logger LOGGER = DhLoggerBuilder.getLogger(MethodHandles.lookup().lookupClass().getSimpleName());
private static final IVersionConstants VERSION_CONSTANTS = SingletonInjector.INSTANCE.get(IVersionConstants.class);
public static final boolean ENABLE_EVENT_LOGGING = true;
@@ -67,6 +69,9 @@ public class ServerApi
}
}
}
public void serverLevelTickEvent(IServerLevelWrapper level) {
//TODO
}
//TODO: rename to serverLoadEvent
public void serverWorldLoadEvent(boolean isDedicatedEnvironment) {
@@ -85,15 +90,15 @@ public class ServerApi
SharedApi.currentWorld = null;
}
public void serverLevelLoadEvent(ILevelWrapper world) {
if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} loading", world);
if (SharedApi.currentWorld instanceof IServerWorld)
SharedApi.currentWorld.getOrLoadLevel(world);
public void serverLevelLoadEvent(IServerLevelWrapper level) {
if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} loading", level);
if (SharedApi.currentWorld != null)
SharedApi.currentWorld.getOrLoadLevel(level);
}
public void serverLevelUnloadEvent(ILevelWrapper world) {
if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} unloading", world);
if (SharedApi.currentWorld instanceof IServerWorld)
SharedApi.currentWorld.unloadLevel(world);
public void serverLevelUnloadEvent(IServerLevelWrapper level) {
if (ENABLE_EVENT_LOGGING) LOGGER.info("Server Level {} unloading", level);
if (SharedApi.currentWorld != null)
SharedApi.currentWorld.unloadLevel(level);
}
@Deprecated
@@ -27,6 +27,7 @@ package com.seibel.lod.core.enums;
* @author James Seibel
* @version 2022-7-13
*/
@Deprecated
public enum ELevelType
{
SERVER_LEVEL,
@@ -24,6 +24,7 @@ import java.util.Iterator;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import com.seibel.lod.core.a7.util.UncheckedInterruptedException;
import com.seibel.lod.core.config.Config;
import com.seibel.lod.core.enums.config.EServerFolderNameMode;
import com.seibel.lod.core.enums.config.EVanillaOverdraw;
@@ -191,61 +192,7 @@ public class LodUtil
return new DHRegionPos(relativePosX, relativePosZ);
}
/**
* If on single player this will return the name of the user's
* world, if in multiplayer it will return the server name, IP,
* and game version.
*/
public static String getWorldID(ILevelWrapper world)
{
if (MC_CLIENT.hasSinglePlayerServer())
{
// chop off the dimension ID as it is not needed/wanted
String dimId = getDimensionIDFromWorld(world);
// get the world name
int saveIndex = dimId.indexOf("saves") + 1 + "saves".length();
int slashIndex = dimId.indexOf(File.separatorChar, saveIndex);
dimId = dimId.substring(saveIndex, slashIndex);
return dimId;
}
else
{
return getServerFolderName();
}
}
/**
* If on single player this will return the name of the user's
* world and the dimensional save folder, if in multiplayer
* it will return the server name, ip, game version, and dimension.<br>
* <br>
* This can be used to determine where to save files for a given
* dimension.
*/
@Deprecated // FIXME: There are soooo many duplicated methods doing the same thing everywhere
public static String getDimensionIDFromWorld(ILevelWrapper world)
{
if (MC_CLIENT.hasSinglePlayerServer())
{
// this will return the world save location
// and the dimension folder
ILevelWrapper serverWorld = LodUtil.getServerWorldFromDimension(world.getDimensionType());
if (serverWorld == null)
throw new NullPointerException("getDimensionIDFromWorld wasn't able to get the WorldWrapper for the dimension " + world.getDimensionType().getDimensionName());
return serverWorld.getSaveFolder().toString();
}
else
{
return getServerFolderName() + File.separatorChar + "dim_" + world.getDimensionType().getDimensionName() + File.separatorChar;
}
}
/** returns the server name, IP and game version. */
@Deprecated // FIXME: There are soooo many duplicated methods doing the same thing everywhere
// Cloned to a7 package's DHFileHandler
@@ -421,10 +368,6 @@ public class LodUtil
if (Thread.interrupted()) throw new InterruptedException();
}
public static void checkInterruptsUnchecked() {
if (Thread.interrupted()) throw new RuntimeException(new InterruptedException());
}
/**
* Format a given string with params using log4j's MessageFormat
*
@@ -51,8 +51,6 @@ public interface IMinecraftClientWrapper extends IBindable
*/
void clearFrameObjectCache();
//=================//
// method wrappers //
//=================//
@@ -64,12 +62,6 @@ public interface IMinecraftClientWrapper extends IBindable
String getCurrentServerName();
String getCurrentServerIp();
String getCurrentServerVersion();
/** Returns the dimension the player is currently in */
IDimensionTypeWrapper getCurrentDimension();
@Deprecated // This should be moved to directly calling the function in core
String getCurrentDimensionId();
//=============//
// Simple gets //
@@ -80,31 +72,17 @@ public interface IMinecraftClientWrapper extends IBindable
DHBlockPos getPlayerBlockPos();
DHChunkPos getPlayerChunkPos();
/**
* Attempts to get the ServerWorld for the dimension
* the user is currently in.
* @return null if no ServerWorld is available
*/
ILevelWrapper getWrappedServerWorld();
@Deprecated
ILevelWrapper getWrappedClientWorld();
File getGameDirectory();
IProfilerWrapper getProfiler();
float getSkyDarken(float partialTicks);
boolean connectedToServer();
int getPlayerSkylight();
/** Returns all worlds available to the server */
ArrayList<ILevelWrapper> getAllServerWorlds();
void sendChatMessage(String string);
/**
@@ -118,6 +96,4 @@ public interface IMinecraftClientWrapper extends IBindable
void crashMinecraft(String errorMessage, Throwable exception);
Object getOptionsObject();
File getSinglePlayerServerFolder();
}
@@ -27,16 +27,6 @@ import com.seibel.lod.core.handlers.dependencyInjection.IBindable;
*/
public interface IBiomeWrapper extends IBindable
{
/** Returns a color int for the given biome. */
int getColorForBiome(int x, int z);
String getName();
int getGrassTint(int x, int z);
int getFolliageTint();
int getWaterTint();
String serialize();
}
@@ -0,0 +1,12 @@
package com.seibel.lod.core.wrapperInterfaces.world;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import javax.annotation.Nullable;
public interface IClientLevelWrapper extends ILevelWrapper {
@Nullable
IServerLevelWrapper tryGetServerSideWrapper();
int computeBaseColor(DHBlockPos pos, IBiomeWrapper biome, IBlockStateWrapper blockState);
}
@@ -23,7 +23,9 @@ import java.io.File;
import com.seibel.lod.core.enums.ELevelType;
import com.seibel.lod.core.handlers.dependencyInjection.IBindable;
import com.seibel.lod.core.objects.DHBlockPos;
import com.seibel.lod.core.objects.DHChunkPos;
import com.seibel.lod.core.wrapperInterfaces.block.IBlockStateWrapper;
import com.seibel.lod.core.wrapperInterfaces.chunk.IChunkWrapper;
/**
@@ -36,8 +38,6 @@ public interface ILevelWrapper extends IBindable
{
IDimensionTypeWrapper getDimensionType();
ELevelType getLevelType();
int getBlockLight(int x, int y, int z);
int getSkyLight(int x, int y, int z);
@@ -48,17 +48,16 @@ public interface ILevelWrapper extends IBindable
int getHeight();
int getSeaLevel();
default short getMinHeight()
{
return 0;
}
/** @throws UnsupportedOperationException if the WorldWrapper isn't for a ServerWorld */
File getSaveFolder() throws UnsupportedOperationException;
default IChunkWrapper tryGetChunk(DHChunkPos pos) {return null;}
boolean hasChunkLoaded(int chunkX, int chunkZ);
IBlockStateWrapper getBlockState(DHBlockPos pos);
IBiomeWrapper getBiome(DHBlockPos pos);
Object unwrapLevel();
}
@@ -0,0 +1,11 @@
package com.seibel.lod.core.wrapperInterfaces.world;
import javax.annotation.Nullable;
import java.io.File;
public interface IServerLevelWrapper extends ILevelWrapper {
@Nullable
IClientLevelWrapper tryGetClientSideWrapper();
File getSaveFolder();
}