From 6c278ea3b13667a65ce22cdb53c58cf770b4ff42 Mon Sep 17 00:00:00 2001
From: s809 <43530948+s809@users.noreply.github.com>
Date: Mon, 23 Sep 2024 00:02:31 +0500
Subject: [PATCH] LAN multiplayer kinda works
---
.../core/api/internal/ServerApi.java | 6 +--
.../core/level/AbstractDhServerLevel.java | 39 +++++++++----------
.../core/level/DhClientServerLevel.java | 25 ------------
.../core/level/DhServerLevel.java | 5 +--
.../core/level/ServerLevelModule.java | 2 -
.../server/ServerPlayerStateManager.java | 11 +++---
.../core/world/AbstractDhServerWorld.java | 20 +++++-----
.../core/world/DhClientServerWorld.java | 16 ++++----
.../core/world/DhServerWorld.java | 8 ++--
9 files changed, 53 insertions(+), 79 deletions(-)
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 extends IDhLevel> 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();
}
}