From ebb47990f41e16ad8090ebd2b079b37e375c5153 Mon Sep 17 00:00:00 2001 From: s809 <43530948+s809@users.noreply.github.com> Date: Thu, 15 Feb 2024 23:15:01 +0500 Subject: [PATCH] Fix immersive portals --- .../distanthorizons/coreapi/ModInfo.java | 4 ++-- .../WorldRemoteGenerationQueue.java | 2 +- .../core/level/DhClientLevel.java | 6 +++++- .../server/RemotePlayerConnectionHandler.java | 21 +++++++++++-------- .../FullDataPartialUpdateMessage.java | 2 -- .../GenTaskPriorityRequestMessage.java | 16 ++++++++++++-- .../core/network/protocol/MessageHandler.java | 3 +-- .../core/pos/DhBlockPos2D.java | 2 ++ .../world/IDimensionTypeWrapper.java | 2 ++ 9 files changed, 39 insertions(+), 19 deletions(-) diff --git a/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java b/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java index 6665b77be..377805e01 100644 --- a/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java +++ b/api/src/main/java/com/seibel/distanthorizons/coreapi/ModInfo.java @@ -26,8 +26,8 @@ package com.seibel.distanthorizons.coreapi; public final class ModInfo { public static final String ID = "distanthorizons"; - /** The internal protocol version used for networking */ - public static final int PROTOCOL_VERSION = 1; + /** The internal protocol version used for networking. Incremented every time any packets are added, changed or removed. */ + public static final int PROTOCOL_VERSION = 2; /** The protocol version used for multiverse networking */ public static final int MULTIVERSE_PLUGIN_PROTOCOL_VERSION = 1; /** The internal mod name */ diff --git a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java index 34c5da6e8..c98ff2197 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/generation/WorldRemoteGenerationQueue.java @@ -100,7 +100,7 @@ public class WorldRemoteGenerationQueue extends AbstractFullDataRequestQueue imp return; }; - CompletableFuture request = this.networkState.getClient().sendRequest(new GenTaskPriorityRequestMessage(posList), GenTaskPriorityResponseMessage.class); + CompletableFuture request = this.networkState.getClient().sendRequest(new GenTaskPriorityRequestMessage(posList, this.level), GenTaskPriorityResponseMessage.class); this.genTaskPriorityRequest = request; request.handleAsync((response, throwable) -> { try diff --git a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java index ed7e2f014..f468076b7 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/level/DhClientLevel.java @@ -210,7 +210,11 @@ public class DhClientLevel extends AbstractDhLevel implements IDhClientLevel { this.dataFileHandler.removeGenRequestIf(p -> !renderState.quadtree.isSectionPosInBounds(p)); } - this.worldGenModule.worldGenTick(new DhBlockPos2D(MC_CLIENT.getPlayerBlockPos())); + + this.worldGenModule.worldGenTick( + new DhBlockPos2D(MC_CLIENT.getPlayerBlockPos()) + .scale(MC_CLIENT.getWrappedClientLevel().getDimensionType().getTeleportationScale(this.getLevelWrapper().getDimensionType())) + ); } } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java index cd047edcc..6e17a05bf 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/server/RemotePlayerConnectionHandler.java @@ -19,6 +19,7 @@ import com.seibel.distanthorizons.core.network.messages.session.PlayerUUIDMessag import com.seibel.distanthorizons.core.network.messages.session.RemotePlayerConfigMessage; import com.seibel.distanthorizons.core.network.protocol.FutureTrackableNetworkMessage; import com.seibel.distanthorizons.core.network.protocol.NetworkMessage; +import com.seibel.distanthorizons.core.util.LodUtil; import com.seibel.distanthorizons.core.wrapperInterfaces.misc.IServerPlayerWrapper; import org.jetbrains.annotations.Nullable; @@ -112,23 +113,25 @@ public class RemotePlayerConnectionHandler implements Closeable { return this.connectedPlayersOnly((msg, serverPlayerState) -> { - if (serverPlayerState.serverPlayer.getLevel() != level.getLevelWrapper()) + LodUtil.assertTrue(msg instanceof ILevelRelatedMessage, "Received message does not implement " + ILevelRelatedMessage.class.getSimpleName() + ": " + msg.getClass().getSimpleName()); + + // Handle only in requested dimension + if (!((ILevelRelatedMessage) msg).isSameLevelAs(level.getLevelWrapper())) { return; } - if (msg instanceof ILevelRelatedMessage) + // If player is not in this dimension and handling multiple dimensions at once is not allowed + if (serverPlayerState.serverPlayer.getLevel() != level.getLevelWrapper() + && !GENERATE_MULTIPLE_DIMENSIONS_CONFIG.get()) { - if (!GENERATE_MULTIPLE_DIMENSIONS_CONFIG.get() && !((ILevelRelatedMessage) msg).isSameLevelAs(level.getLevelWrapper())) + // If the message can be replied to - reply with error, otherwise just ignore + if (msg instanceof FutureTrackableNetworkMessage) { - if (msg instanceof FutureTrackableNetworkMessage) - { - ((FutureTrackableNetworkMessage) msg).sendResponse(new InvalidLevelException("Invalid level")); - } - - return; + ((FutureTrackableNetworkMessage) msg).sendResponse(new InvalidLevelException("Invalid level")); } + return; } next.accept(msg, serverPlayerState); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java index 795232ec2..652aa0e86 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/FullDataPartialUpdateMessage.java @@ -86,9 +86,7 @@ public class FullDataPartialUpdateMessage extends NetworkMessage implements ILev public void decode(ByteBuf in) { this.levelHashCode = in.readInt(); - this.chunkPos = new DhChunkPos(in.readInt(), in.readInt()); - this.dataBuffer = in.readBytes(in.readInt()); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/generation/GenTaskPriorityRequestMessage.java b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/generation/GenTaskPriorityRequestMessage.java index e0eff26b5..4d5dfa414 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/generation/GenTaskPriorityRequestMessage.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/messages/fullData/generation/GenTaskPriorityRequestMessage.java @@ -19,6 +19,8 @@ package com.seibel.distanthorizons.core.network.messages.fullData.generation; +import com.seibel.distanthorizons.core.level.IDhLevel; +import com.seibel.distanthorizons.core.network.messages.base.ILevelRelatedMessage; import com.seibel.distanthorizons.core.network.protocol.FutureTrackableNetworkMessage; import com.seibel.distanthorizons.core.pos.DhSectionPos; import io.netty.buffer.ByteBuf; @@ -26,25 +28,35 @@ import io.netty.buffer.ByteBuf; import java.util.ArrayList; import java.util.List; -public class GenTaskPriorityRequestMessage extends FutureTrackableNetworkMessage +public class GenTaskPriorityRequestMessage extends FutureTrackableNetworkMessage implements ILevelRelatedMessage { public List posList = new ArrayList<>(); + private int levelHashCode; + @Override + public int getLevelHashCode() { return this.levelHashCode; } + + public GenTaskPriorityRequestMessage() { } - public GenTaskPriorityRequestMessage(List posList) + public GenTaskPriorityRequestMessage(List posList, IDhLevel level) { this.posList = posList; + + // TODO Multiverse support + this.levelHashCode = level.getLevelWrapper().getDimensionType().getDimensionName().hashCode(); } @Override protected void encode0(ByteBuf out) { + out.writeInt(this.levelHashCode); this.encodeCollection(out, this.posList); } @Override protected void decode0(ByteBuf in) { + this.levelHashCode = in.readInt(); this.decodeCollection(in, this.posList, DhSectionPos::zero); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java index 1d4fd375c..eb2c00d63 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/protocol/MessageHandler.java @@ -74,9 +74,8 @@ public class MessageHandler extends SimpleChannelInboundHandler } @Override - public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception + public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) { - super.exceptionCaught(ctx, cause); this.closeReasonConsumer.accept(ctx, cause); ctx.close(); diff --git a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java index c6f8c1906..60bb331c4 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/pos/DhBlockPos2D.java @@ -59,6 +59,8 @@ public class DhBlockPos2D public DhBlockPos2D subtract(DhBlockPos2D other) { return new DhBlockPos2D(this.x - other.x, this.z - other.z); } + public DhBlockPos2D scale(double scale) { return new DhBlockPos2D((int) (this.x * scale), (int) (this.z * scale)); } + public Pos2D toPos2D() { return new Pos2D(this.x, this.z); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IDimensionTypeWrapper.java b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IDimensionTypeWrapper.java index 0422e0ba9..d33fc77fa 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IDimensionTypeWrapper.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/wrapperInterfaces/world/IDimensionTypeWrapper.java @@ -37,4 +37,6 @@ public interface IDimensionTypeWrapper extends IDhApiDimensionTypeWrapper, IBind @Override boolean hasSkyLight(); + double getTeleportationScale(IDimensionTypeWrapper to); + }