diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java index 5dab86791..94890eb9c 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ServerApi.java @@ -149,7 +149,7 @@ public class ServerApi public void serverPlayerJoinEvent(IServerPlayerWrapper player) { IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); - LOGGER.info("Player [" + player.getName() + "] joined."); + LOGGER.info("Player [${player.getName()}] joined."); if (serverWorld != null) { serverWorld.addPlayer(player); @@ -158,7 +158,7 @@ public class ServerApi public void serverPlayerDisconnectEvent(IServerPlayerWrapper player) { IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); - LOGGER.info("Player [" + player.getName() + "] disconnected."); + LOGGER.info("Player [${player.getName()}] disconnected."); if (serverWorld != null) { serverWorld.removePlayer(player); @@ -167,7 +167,7 @@ public class ServerApi public void serverPlayerLevelChangeEvent(IServerPlayerWrapper player, IServerLevelWrapper originLevel, IServerLevelWrapper destinationLevel) { IDhServerWorld serverWorld = SharedApi.getIDhServerWorld(); - LOGGER.info("Player [" + player.getName() + "] changed level: [" + originLevel.getKeyedLevelDimensionName() + "] -> [" + destinationLevel.getKeyedLevelDimensionName() + "]."); + LOGGER.info("Player [${player.getName()}] changed level: [${originLevel.getKeyedLevelDimensionName()}] -> [${destinationLevel.getKeyedLevelDimensionName()}]."); if (serverWorld != null) { serverWorld.changePlayerLevel(player, originLevel, destinationLevel); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java index 49ffc28e7..8f68e5f86 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/AbstractDhServerLevel.java @@ -64,12 +64,10 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I // constructor // //=============// - public AbstractDhServerLevel( - AbstractSaveStructure saveStructure, - IServerLevelWrapper serverLevelWrapper, - ServerPlayerStateManager serverPlayerStateManager - ) - { this(saveStructure, serverLevelWrapper, serverPlayerStateManager, true); } + public AbstractDhServerLevel(AbstractSaveStructure saveStructure, IServerLevelWrapper serverLevelWrapper, ServerPlayerStateManager serverPlayerStateManager) + { + this(saveStructure, serverLevelWrapper, serverPlayerStateManager, true); + } public AbstractDhServerLevel( AbstractSaveStructure saveStructure, IServerLevelWrapper serverLevelWrapper, @@ -89,7 +87,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I this.runRepoReliantSetup(); } - LOGGER.info("Started " + this.getClass().getSimpleName() + " for [" + serverLevelWrapper + "] at [" + saveStructure + "]."); + LOGGER.info("Started ${this.getClass().getSimpleName()} for $serverLevelWrapper at $saveStructure."); this.serverPlayerStateManager = serverPlayerStateManager; } @@ -113,7 +111,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I continue; } - NETWORK_LOGGER.debug("[" + this.serverLevelWrapper.getDimensionName() + "] Fulfilled request group [" + entry.getKey() + "]"); + NETWORK_LOGGER.debug("[${this.serverLevelWrapper.getDimensionName()}] Fulfilled request group [${entry.getKey()}]"); // Make this group unavailable for adding into this.requestGroupByPos.remove(entry.getKey()); @@ -148,7 +146,10 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I } @Override - public abstract boolean shouldDoWorldGen(); + public boolean shouldDoWorldGen() + { + return Config.Client.Advanced.WorldGenerator.enableDistantGeneration.get() && !this.worldGenPlayerCenteringQueue.isEmpty(); + } @Override @Nullable @@ -224,7 +225,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I FullDataSourceRequestMessage requestMessage = requestGroup.requestMessages.remove(msg.futureId); if (requestGroup.requestMessages.isEmpty()) { - NETWORK_LOGGER.debug("[" + this.serverLevelWrapper.getDimensionName() + "] Cancelled request group [" + DhSectionPos.toString(requestMessage.sectionPos) + "]."); + NETWORK_LOGGER.debug("[${this.serverLevelWrapper.getDimensionName()}] Cancelled request group [${DhSectionPos.toString(requestMessage.sectionPos)}]."); this.requestGroupByPos.remove(requestMessage.sectionPos); this.serverside.fullDataFileHandler.removeRetrievalRequestIf(pos -> pos == requestMessage.sectionPos); } @@ -300,7 +301,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I { DataSourceRequestGroup newGroup = new DataSourceRequestGroup(); this.tryFulfillDataSourceRequestGroup(newGroup, pos); - NETWORK_LOGGER.debug("[" + this.serverLevelWrapper.getDimensionName() + "] Created request group for pos [" + DhSectionPos.toString(pos) + "]."); + NETWORK_LOGGER.debug("[${serverLevelWrapper.getDimensionName()}] Created request group for pos [${DhSectionPos.toString(pos)}]."); return newGroup; }); @@ -324,7 +325,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I { if (!(message instanceof ILevelRelatedMessage)) { - LodUtil.assertNotReach("Received message [" + ILevelRelatedMessage.class.getSimpleName() + "] does not implement [" + message.getClass().getSimpleName() + "]"); + LodUtil.assertNotReach("Received message [$message] does not implement [${ILevelRelatedMessage.class.getSimpleName()}]"); } // Only handle requests for this level @@ -345,9 +346,9 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I ((AbstractTrackableMessage) message).sendResponse( new InvalidLevelException( "Generation not allowed. " + - "Requested dimension: [" + ((ILevelRelatedMessage) message).getLevelName() + "], " + - "player dimension: [" + message.getSession().serverPlayer.getLevel().getDimensionName() + "], " + - "handler dimension: [" + this.getLevelWrapper().getDimensionName() + "]" + "Requested dimension: [${((ILevelRelatedMessage) message).getLevelName()}], " + + "player dimension: [${message.getSession().serverPlayer.getLevel().getDimensionName()}], " + + "handler dimension: [${this.getLevelWrapper().getDimensionName()}]" ) ); } @@ -495,11 +496,9 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I public FullDataSourceV2 fullDataSource; /** - * These semaphores prevent a given thread from accidentally locking on the same group - * multiple times, as the semaphore is tied to the given thread.
- * Reentrant Lock isn't used since it would allow the thread to lock on the same group.
- * the Short.MAX_VALUE is just a very large number that should be larger than the number of - * threads we'll have. + * These two Semaphores are used to prevent all threads from locking on the group after it being fulfilled, + * as opposed to ReentrantReadWriteLocks which would allow the locking thread continue using it anyway.
+ * Short.MAX_VALUE is chosen as a large enough number so non-exclusive accesses never block each other. */ public final Semaphore requestAddSemaphore = new Semaphore(Short.MAX_VALUE, true); /** @see DataSourceRequestGroup#requestAddSemaphore */ diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java index 6085f9d61..fe450a3e2 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientServerLevel.java @@ -28,7 +28,6 @@ import com.seibel.distanthorizons.core.render.RenderBufferHandler; import com.seibel.distanthorizons.core.render.renderer.DebugRenderer; import com.seibel.distanthorizons.core.file.structure.AbstractSaveStructure; import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos; -import com.seibel.distanthorizons.core.pos.blockPos.DhBlockPos2D; import com.seibel.distanthorizons.core.render.renderer.generic.GenericObjectRenderer; import com.seibel.distanthorizons.core.wrapperInterfaces.block.IBlockStateWrapper; import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IProfilerWrapper; @@ -36,7 +35,6 @@ import com.seibel.distanthorizons.core.wrapperInterfaces.minecraft.IMinecraftCli 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 org.jetbrains.annotations.Nullable; import java.awt.*; import java.util.List; @@ -48,7 +46,6 @@ public class DhClientServerLevel extends AbstractDhServerLevel implements IDhCli private static final IMinecraftClientWrapper MC_CLIENT = SingletonInjector.INSTANCE.get(IMinecraftClientWrapper.class); public final ClientLevelModule clientside; - private int localPlayerWorldGenPosInQueue = 0; @@ -82,28 +79,6 @@ public class DhClientServerLevel extends AbstractDhServerLevel implements IDhCli public void renderDeferred(DhApiRenderParam renderEventParam, IProfilerWrapper profiler) { this.clientside.renderDeferred(renderEventParam, profiler); } - @Override - public boolean shouldDoWorldGen() - { - return this.serverside.worldGeneratorEnabledConfig.get() && this.clientside.isRendering() || !this.worldGenPlayerCenteringQueue.isEmpty(); - } - - @Override - @Nullable - public DhBlockPos2D getTargetPosForGeneration() - { - if (this.localPlayerWorldGenPosInQueue > 0) - { - this.localPlayerWorldGenPosInQueue--; - return super.getTargetPosForGeneration(); - } - else - { - this.localPlayerWorldGenPosInQueue = this.worldGenPlayerCenteringQueue.size(); - return new DhBlockPos2D(MC_CLIENT.getPlayerBlockPos()); - } - } - //========// // render // //========// 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 3fd3b0e80..7178c992b 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 @@ -78,8 +78,7 @@ public class DhServerLevel extends AbstractDhServerLevel @Override public void addDebugMenuStringsToList(List messageList) { - String dimName = this.serverLevelWrapper.getDimensionName(); - messageList.add("["+dimName+"]"); + messageList.add("[${this.serverLevelWrapper.getDimensionName()}]"); } @@ -93,7 +92,7 @@ public class DhServerLevel extends AbstractDhServerLevel { super.close(); this.serverside.close(); - LOGGER.info("Closed DHLevel for ["+this.getLevelWrapper()+"]."); + LOGGER.info("Closed DHLevel for [${this.getLevelWrapper()}]."); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java index 9da620788..90e69cc3b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/ServerLevelModule.java @@ -37,7 +37,6 @@ public class ServerLevelModule implements AutoCloseable private final IDhServerLevel parentServerLevel; public final AbstractSaveStructure saveStructure; public final GeneratedFullDataSourceProvider fullDataFileHandler; - public final AppliedConfigState worldGeneratorEnabledConfig; public final WorldGenModule worldGenModule; @@ -52,7 +51,6 @@ public class ServerLevelModule implements AutoCloseable this.parentServerLevel = parentServerLevel; this.saveStructure = saveStructure; this.fullDataFileHandler = new GeneratedFullDataSourceProvider(parentServerLevel, saveStructure); - this.worldGeneratorEnabledConfig = new AppliedConfigState<>(Config.Client.Advanced.WorldGenerator.enableDistantGeneration); this.worldGenModule = new WorldGenModule(this.parentServerLevel, this.fullDataFileHandler, () -> new ServerLevelModule.WorldGenState(this.parentServerLevel)); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerStateManager.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerStateManager.java index 51ac789f1..a0bff6fd7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerStateManager.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerStateManager.java @@ -1,7 +1,6 @@ package com.seibel.distanthorizons.core.multiplayer.server; import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; -import com.seibel.distanthorizons.core.network.session.NetworkSession; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import org.jetbrains.annotations.Nullable; @@ -26,10 +25,6 @@ public class ServerPlayerStateManager { ServerPlayerState playerState = new ServerPlayerState(serverPlayer); this.connectedPlayerStateByPlayerWrapper.put(serverPlayer, playerState); - - MessageQueueState messageQueue = this.messageQueueByPlayerWrapper.computeIfAbsent(serverPlayer, k -> new MessageQueueState()); - this.handlePluginMessagesFromQueue(playerState, messageQueue); - return playerState; } @@ -60,6 +55,12 @@ public class ServerPlayerStateManager } } + public void handlePluginMessagesFromQueue(ServerPlayerState playerState) + { + MessageQueueState messageQueue = this.messageQueueByPlayerWrapper.computeIfAbsent(playerState.getServerPlayer(), k -> new MessageQueueState()); + this.handlePluginMessagesFromQueue(playerState, messageQueue); + } + private void handlePluginMessagesFromQueue(ServerPlayerState playerState, MessageQueueState messageQueueState) { while (!messageQueueState.messageQueue.isEmpty() && messageQueueState.isBeingDrained.compareAndSet(false, true)) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java b/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java index d5bb12dea..201415238 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/world/AbstractDhServerWorld.java @@ -14,7 +14,7 @@ import java.util.HashMap; public abstract class AbstractDhServerWorld extends AbstractDhWorld implements IDhServerWorld { - protected final HashMap levelWrapperByDhLevel = new HashMap<>(); + protected final HashMap dhLevelByLevelWrapper = new HashMap<>(); public final LocalSaveStructure saveStructure = new LocalSaveStructure(); private final ServerPlayerStateManager serverPlayerStateManager; @@ -43,10 +43,12 @@ public abstract class AbstractDhServerWorld) this.dhLevelByLevelWrapper.values().stream().distinct()::iterator) { level.registerNetworkHandlers(playerState); } + + this.serverPlayerStateManager.handlePluginMessagesFromQueue(playerState); } @Override @@ -72,11 +74,11 @@ public abstract class AbstractDhServerWorld getAllLoadedLevels() { return this.levelWrapperByDhLevel.values(); } + public Iterable getAllLoadedLevels() { return this.dhLevelByLevelWrapper.values(); } @Override - public int getLoadedLevelCount() { return this.levelWrapperByDhLevel.size(); } + public int getLoadedLevelCount() { return this.dhLevelByLevelWrapper.size(); } @@ -85,10 +87,10 @@ public abstract class AbstractDhServerWorld + return this.dhLevelByLevelWrapper.computeIfAbsent(wrapper, (levelWrapper) -> { File levelFile = this.saveStructure.getLevelFolder(levelWrapper); LodUtil.assertTrue(levelFile != null); @@ -75,7 +75,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld + return this.dhLevelByLevelWrapper.computeIfAbsent(wrapper, (levelWrapper) -> { IClientLevelWrapper clientLevelWrapper = (IClientLevelWrapper) levelWrapper; IServerLevelWrapper serverLevelWrapper = clientLevelWrapper.tryGetServerSideWrapper(); @@ -86,7 +86,7 @@ public class DhClientServerWorld extends AbstractDhServerWorld return null; } - return this.levelWrapperByDhLevel.computeIfAbsent(wrapper, (serverLevelWrapper) -> + return this.dhLevelByLevelWrapper.computeIfAbsent(wrapper, (serverLevelWrapper) -> { File levelFile = this.saveStructure.getLevelFolder(wrapper); LodUtil.assertTrue(levelFile != null); @@ -68,11 +68,11 @@ public class DhServerWorld extends AbstractDhServerWorld return; } - if (this.levelWrapperByDhLevel.containsKey(wrapper)) + if (this.dhLevelByLevelWrapper.containsKey(wrapper)) { - LOGGER.info("Unloading level {} ", this.levelWrapperByDhLevel.get(wrapper)); + LOGGER.info("Unloading level {} ", this.dhLevelByLevelWrapper.get(wrapper)); wrapper.onUnload(); - this.levelWrapperByDhLevel.remove(wrapper).close(); + this.dhLevelByLevelWrapper.remove(wrapper).close(); } }