From 7f0c42396bb568493663fe689fb4cb6c3cc3a6fe Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Sun, 29 Sep 2024 22:24:38 +0500 Subject: [PATCH 1/2] Use more correct distance function for real-time updates --- .../distanthorizons/core/level/AbstractDhServerLevel.java | 2 +- .../com/seibel/distanthorizons/core/pos/DhSectionPos.java | 8 ++++++++ 2 files changed, 9 insertions(+), 1 deletion(-) 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 a7d4d0d5f..eab5b3e5b 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 @@ -426,7 +426,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I } Vec3d playerPosition = serverPlayerState.getServerPlayer().getPosition(); - int distanceFromPlayer = DhSectionPos.getManhattanBlockDistance(data.getPos(), new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; + int distanceFromPlayer = DhSectionPos.getChebyshevBlockDistance(data.getPos(), new DhBlockPos2D((int) playerPosition.x, (int) playerPosition.z)) / 16; if (distanceFromPlayer >= serverPlayerState.getServerPlayer().getViewDistance() && distanceFromPlayer <= serverPlayerState.sessionConfig.getRenderDistanceRadius()) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java index a3d61a122..d02071b4b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhSectionPos.java @@ -261,6 +261,14 @@ public class DhSectionPos + Math.abs(getCenterBlockPosZ(pos) - blockPos.z); } + public static int getChebyshevBlockDistance(long pos, DhBlockPos2D blockPos) + { + return Math.max( + Math.abs(getCenterBlockPosX(pos) - blockPos.x), + Math.abs(getCenterBlockPosZ(pos) - blockPos.z) + ); + } + //==================// From f9d008ef787b00cfa7b72794d837473fb47ffa75 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Sun, 29 Sep 2024 22:45:36 +0500 Subject: [PATCH 2/2] Fix real-time updates being sent to non-ready players --- .../distanthorizons/core/level/AbstractDhServerLevel.java | 2 +- .../core/multiplayer/server/ServerPlayerState.java | 1 + .../core/multiplayer/server/ServerPlayerStateManager.java | 4 +++- 3 files changed, 5 insertions(+), 2 deletions(-) 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 eab5b3e5b..b321761f8 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 @@ -413,7 +413,7 @@ public abstract class AbstractDhServerLevel extends AbstractDhLevel implements I CompletableFuture.runAsync(() -> { FullDataPayload payload = new FullDataPayload(data); - for (ServerPlayerState serverPlayerState : this.serverPlayerStateManager.getConnectedPlayers()) + for (ServerPlayerState serverPlayerState : this.serverPlayerStateManager.getReadyPlayers()) { if (serverPlayerState.getServerPlayer().getLevel() != this.serverLevelWrapper) { diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java index c5674a763..64dd742f9 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/ServerPlayerState.java @@ -32,6 +32,7 @@ public class ServerPlayerState implements Closeable @NotNull public final SessionConfig sessionConfig = new SessionConfig(); + public boolean isReady() { return this.sessionConfig.constrainingConfig != null; } private final ConcurrentHashMap rateLimiterSets = new ConcurrentHashMap<>(); public RateLimiterSet getRateLimiterSet(AbstractDhServerLevel level) { return this.rateLimiterSets.computeIfAbsent(level, ignored -> new RateLimiterSet()); } 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 a0bff6fd7..b4520d395 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 @@ -4,6 +4,7 @@ import com.seibel.distanthorizons.core.network.messages.AbstractNetworkMessage; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import org.jetbrains.annotations.Nullable; +import java.util.Collection; import java.util.Queue; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; @@ -80,7 +81,8 @@ public class ServerPlayerStateManager @Nullable public ServerPlayerState getConnectedPlayer(IServerPlayerWrapper player) { return this.connectedPlayerStateByPlayerWrapper.get(player); } - public Iterable getConnectedPlayers() { return this.connectedPlayerStateByPlayerWrapper.values(); } + public Collection getConnectedPlayers() { return this.connectedPlayerStateByPlayerWrapper.values(); } + public Iterable getReadyPlayers() { return this.getConnectedPlayers().stream().filter(ServerPlayerState::isReady)::iterator; } private static class MessageQueueState