From 768ce5b8fd1da56ee96e94c43bce6215f663fd9f Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Mon, 24 Jul 2023 19:16:05 +0500 Subject: [PATCH] something --- .../sources/CompleteFullDataSource.java | 4 +- .../HighDetailIncompleteFullDataSource.java | 2 +- .../LowDetailIncompleteFullDataSource.java | 4 +- .../RemoteFullDataFileHandler.java | 65 +++++++++++-------- .../core/level/DhServerLevel.java | 8 ++- .../core/logging/ConfigBasedLogger.java | 2 +- .../core/world/DhServerWorld.java | 20 +++++- .../misc/IServerPlayerWrapper.java | 3 + 8 files changed, 70 insertions(+), 38 deletions(-) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java index d668c4fa5..8ac18dbcd 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/CompleteFullDataSource.java @@ -88,9 +88,9 @@ public class CompleteFullDataSource extends FullDataArrayAccessor implements IFu public FullDataSourceSummaryData readSourceSummaryInfo(FullDataMetaFile dataFile, DhDataInputStream inputStream, IDhLevel level) throws IOException { int dataDetail = inputStream.readInt(); - if (dataDetail != dataFile.baseMetaData.dataLevel) + if (dataFile.baseMetaData != null && dataDetail != dataFile.baseMetaData.dataLevel) { - throw new IOException(LodUtil.formatLog("Data level mismatch: "+dataDetail+" != "+dataFile.baseMetaData.dataLevel)); + throw new IOException(LodUtil.formatLog("Data level mismatch: " + dataDetail + " != " + dataFile.baseMetaData.dataLevel)); } int width = inputStream.readInt(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java index 9af991742..535b10940 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/HighDetailIncompleteFullDataSource.java @@ -129,7 +129,7 @@ public class HighDetailIncompleteFullDataSource implements IIncompleteFullDataSo LodUtil.assertTrue(dataFile.pos.sectionDetailLevel <= MAX_SECTION_DETAIL); int dataDetail = inputStream.readShort(); - if(dataDetail != dataFile.baseMetaData.dataLevel) + if (dataFile.baseMetaData != null && dataDetail != dataFile.baseMetaData.dataLevel) { throw new IOException(LodUtil.formatLog("Data level mismatch: {} != {}", dataDetail, dataFile.baseMetaData.dataLevel)); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java index b83bda615..e6c0c7233 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/dataObjects/fullData/sources/LowDetailIncompleteFullDataSource.java @@ -103,9 +103,9 @@ public class LowDetailIncompleteFullDataSource extends FullDataArrayAccessor imp public FullDataSourceSummaryData readSourceSummaryInfo(FullDataMetaFile dataFile, DhDataInputStream inputStream, IDhLevel level) throws IOException { int dataDetail = inputStream.readInt(); - if(dataDetail != dataFile.baseMetaData.dataLevel) + if (dataFile.baseMetaData != null && dataDetail != dataFile.baseMetaData.dataLevel) { - throw new IOException(LodUtil.formatLog("Data level mismatch: "+dataDetail+" != "+dataFile.baseMetaData.dataLevel)); + throw new IOException(LodUtil.formatLog("Data level mismatch: " + dataDetail + " != " + dataFile.baseMetaData.dataLevel)); } int width = inputStream.readInt(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataFileHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataFileHandler.java index 76b80dfa4..1bdbd7dae 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataFileHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/file/fullDatafile/RemoteFullDataFileHandler.java @@ -10,6 +10,7 @@ import com.seibel.distanthorizons.core.network.messages.FullDataSourceRequestMes import com.seibel.distanthorizons.core.network.messages.FullDataSourceResponseMessage; import com.seibel.distanthorizons.core.pos.DhSectionPos; import org.apache.logging.log4j.Logger; +import org.jetbrains.annotations.NotNull; import java.util.ArrayList; import java.util.concurrent.CompletableFuture; @@ -34,34 +35,42 @@ public class RemoteFullDataFileHandler extends FullDataFileHandler @Override public CompletableFuture read(DhSectionPos pos) { - return super.read(pos).thenCompose(fullDataSource -> { - if (fullDataSource == null) - return null; - - if (!fullDataSource.isEmpty()) - return CompletableFuture.completedFuture(fullDataSource); - - FullDataMetaFile metaFile = this.getLoadOrMakeFile(pos, true); - totalRequests++; - return networkClient.sendRequest(new FullDataSourceRequestMessage(pos)) - .handle((response, throwable) -> { - try - { - finishedRequests++; - if (throwable != null) - throw throwable; - - LOGGER.info("FullDataSourceResponseMessage " + pos); - return response.getFullDataSource(metaFile, level); - } - catch (Throwable e) - { - failedRequests++; - LOGGER.error(e); - return null; - } - }); - }); + FullDataMetaFile metaFile = this.getLoadOrMakeFile(pos, false); + if (metaFile != null) + { + return super.read(pos).thenCompose(fullDataSource -> requestFromServer(pos, fullDataSource)); + } + else + { + return requestFromServer(pos, null).thenCompose(fullDataSource -> fullDataSource != null + ? CompletableFuture.completedFuture(fullDataSource) + : super.read(pos)); + } + } + + @NotNull + private CompletableFuture requestFromServer(DhSectionPos pos, IFullDataSource fullDataSource) + { + totalRequests++; + return networkClient.sendRequest(new FullDataSourceRequestMessage(pos)) + .handle((response, throwable) -> { + try + { + finishedRequests++; + if (throwable != null) + throw throwable; + + LOGGER.info("FullDataSourceResponseMessage " + pos); + FullDataMetaFile metaFile = this.getLoadOrMakeFile(pos, true); + return response.getFullDataSource(metaFile, level); + } + catch (Throwable e) + { + failedRequests++; + LOGGER.error("Error while fetching full data source", e); + return fullDataSource; + } + }); } private String[] f3Log() diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java index ce497272f..6eb5cd1a0 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhServerLevel.java @@ -80,10 +80,14 @@ public class DhServerLevel extends DhLevel implements IDhServerLevel // stop world gen serverside.stopWorldGen(); } - + } + + public void doWorldGen(DhBlockPos2D pos) { + this.doWorldGen(); + if (serverside.isWorldGenRunning()) { - serverside.worldGenTick(new DhBlockPos2D(0, 0)); // todo; + serverside.worldGenTick(pos); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/logging/ConfigBasedLogger.java b/core/src/main/java/com/seibel/distanthorizons/core/logging/ConfigBasedLogger.java index 8f52f8572..9e09e1825 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/logging/ConfigBasedLogger.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/logging/ConfigBasedLogger.java @@ -101,7 +101,7 @@ public class ConfigBasedLogger else logger.log(logLevel, msgStr); } - if (mode.levelForChat.isLessSpecificThan(level)) + if (MC != null && mode.levelForChat.isLessSpecificThan(level)) { if (param.length > 0 && param[param.length - 1] instanceof Throwable) MC.logToChat(level, msgStr + "\n" + diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java index 9ac154682..d4d0e025c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/DhServerWorld.java @@ -24,6 +24,7 @@ import java.io.File; import java.util.HashMap; import java.util.UUID; import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentLinkedQueue; public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld { @@ -33,7 +34,8 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld private final NetworkServer networkServer; private final HashMap playersByUUID; private final BiMap playersByConnection; - + private final ConcurrentLinkedQueue worldGenLoopingQueue = new ConcurrentLinkedQueue<>(); + public DhServerWorld() @@ -109,9 +111,11 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld public void addPlayer(IServerPlayerWrapper serverPlayer) { this.playersByUUID.put(serverPlayer.getUUID(), new RemotePlayer(serverPlayer)); + this.worldGenLoopingQueue.add(serverPlayer); } public void removePlayer(IServerPlayerWrapper serverPlayer) { + this.worldGenLoopingQueue.remove(serverPlayer); RemotePlayer dhPlayer = this.playersByUUID.remove(serverPlayer.getUUID()); ChannelHandlerContext channelContext = this.playersByConnection.inverse().remove(dhPlayer); if (channelContext != null) @@ -167,7 +171,19 @@ public class DhServerWorld extends AbstractDhWorld implements IDhServerWorld public void serverTick() { this.levels.values().forEach(DhServerLevel::serverTick); } - public void doWorldGen() { this.levels.values().forEach(DhServerLevel::doWorldGen); } + public void doWorldGen() { this.levels.values().forEach(level -> { + // TODO Deal with dimensions and dimension switches + + IServerPlayerWrapper firstPlayer = this.worldGenLoopingQueue.poll(); + if (firstPlayer == null) { + level.doWorldGen(); + return; + } + this.worldGenLoopingQueue.add(firstPlayer); + + com.seibel.distanthorizons.coreapi.util.math.Vec3d position = firstPlayer.getPosition(); + level.doWorldGen(new DhBlockPos2D((int) position.x, (int) position.z)); + }); } @Override public CompletableFuture saveAndFlush() diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java index 6b08113e4..cd0a73448 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/misc/IServerPlayerWrapper.java @@ -2,6 +2,7 @@ package com.seibel.distanthorizons.core.wrapperInterfaces.misc; import com.seibel.distanthorizons.api.interfaces.IDhApiUnsafeWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.world.IServerLevelWrapper; +import com.seibel.distanthorizons.coreapi.util.math.Vec3d; import java.util.UUID; @@ -10,4 +11,6 @@ public interface IServerPlayerWrapper extends IDhApiUnsafeWrapper UUID getUUID(); IServerLevelWrapper getLevel(); + + Vec3d getPosition(); }