diff --git a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java index 688d2f809..29ffee347 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/api/internal/ClientPluginChannelApi.java @@ -52,7 +52,7 @@ public class ClientPluginChannelApi Objects.requireNonNull(session); this.session = session; session.registerHandler(CurrentLevelKeyMessage.class, this::onCurrentLevelKeyMessage); - session.registerHandler(CloseEvent.class, this::onClose); + session.registerHandler(CloseEvent.class, false, this::onClose); } private void onCurrentLevelKeyMessage(CurrentLevelKeyMessage msg) diff --git a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java index 850920e7e..d7f18154b 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/multiplayer/client/ClientNetworkState.java @@ -63,7 +63,7 @@ public class ClientNetworkState implements Closeable this.configReceived = true; }); - this.session.registerHandler(CloseEvent.class, msg -> + this.session.registerHandler(CloseEvent.class, false, msg -> { this.configReceived = false; }); 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 6a3c04502..d3a15c1e4 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 @@ -53,7 +53,7 @@ public class ServerPlayerState this.session.sendMessage(new RemotePlayerConfigMessage(this.config)); }); - this.session.registerHandler(CloseEvent.class, event -> { + this.session.registerHandler(CloseEvent.class, false, event -> { // Noop }); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/event/CloseEvent.java b/core/src/main/java/com/seibel/distanthorizons/core/network/event/CloseEvent.java index 8ee84fbfb..cbd3a1a31 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/event/CloseEvent.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/event/CloseEvent.java @@ -1,16 +1,9 @@ package com.seibel.distanthorizons.core.network.event; -import com.seibel.distanthorizons.core.network.messages.NetworkMessage; -import io.netty.buffer.ByteBuf; - /** - * This is not a "real" message, and only used to indicate a disconnection. + * This event is used to indicate a disconnect. */ -public class CloseEvent extends NetworkMessage +public class CloseEvent extends InternalEvent { - @Override - public void encode(ByteBuf out) { throw new UnsupportedOperationException(this.getClass().getSimpleName() + " is not a real message, and cannot be sent."); } - @Override - public void decode(ByteBuf in) { throw new UnsupportedOperationException(this.getClass().getSimpleName() + " is not a real message, and cannot be received."); } } \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/event/InternalEvent.java b/core/src/main/java/com/seibel/distanthorizons/core/network/event/InternalEvent.java new file mode 100644 index 000000000..12bcf834e --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/event/InternalEvent.java @@ -0,0 +1,20 @@ +package com.seibel.distanthorizons.core.network.event; + +import com.seibel.distanthorizons.core.network.messages.NetworkMessage; +import io.netty.buffer.ByteBuf; + +public abstract class InternalEvent extends NetworkMessage +{ + @Override + public void encode(ByteBuf out) + { + throw new UnsupportedOperationException(this.getClass().getSimpleName() + " is an internal event, and cannot be sent."); + } + + @Override + public void decode(ByteBuf in) + { + throw new UnsupportedOperationException(this.getClass().getSimpleName() + " is an internal event, and cannot be received."); + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/event/NetworkEventSource.java b/core/src/main/java/com/seibel/distanthorizons/core/network/event/NetworkEventSource.java index f1c0f3dd5..49e21e60f 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/event/NetworkEventSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/event/NetworkEventSource.java @@ -108,20 +108,22 @@ public abstract class NetworkEventSource } } - public abstract void registerHandler(Class handlerClass, Consumer handlerImplementation); - - protected void registerHandler(NetworkEventSource instance, Class handlerClass, Consumer handlerImplementation) + public abstract void registerHandler(Class handlerClass, boolean throwIfMessageNotRegistered, Consumer handlerImplementation); + + public final void registerHandler(Class handlerClass, Consumer handlerImplementation) { + this.registerHandler(handlerClass, true, handlerImplementation); + } + + protected final void registerHandler(NetworkEventSource instance, Class handlerClass, boolean throwIfMessageNotRegistered, Consumer handlerImplementation) + { + if (throwIfMessageNotRegistered) + { + MessageRegistry.INSTANCE.getMessageId(handlerClass); + } + //noinspection unchecked - this.handlers.computeIfAbsent(handlerClass, missingHandlerClass -> - { - // Will throw if the handler class is not found - if (missingHandlerClass != CloseEvent.class) - { - MessageRegistry.INSTANCE.getMessageId(missingHandlerClass); - } - return new ConcurrentHashMap<>(); - }) + this.handlers.computeIfAbsent(handlerClass, missingHandlerClass -> new ConcurrentHashMap<>()) .computeIfAbsent(instance, _instance -> ConcurrentHashMap.newKeySet()) .add((Consumer) handlerImplementation); } diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/event/ProtocolErrorEvent.java b/core/src/main/java/com/seibel/distanthorizons/core/network/event/ProtocolErrorEvent.java new file mode 100644 index 000000000..be6ff4272 --- /dev/null +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/event/ProtocolErrorEvent.java @@ -0,0 +1,21 @@ +package com.seibel.distanthorizons.core.network.event; + +import com.seibel.distanthorizons.core.network.messages.NetworkMessage; +import org.jetbrains.annotations.Nullable; + +/** + * This event is used to indicate that encoding or decoding of a message threw an exception. + */ +public class ProtocolErrorEvent extends InternalEvent +{ + public final Throwable throwable; + @Nullable + public final NetworkMessage message; + + public ProtocolErrorEvent(Throwable throwable, @Nullable NetworkMessage message) + { + this.throwable = throwable; + this.message = message; + } + +} \ No newline at end of file diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/event/ScopedNetworkEventSource.java b/core/src/main/java/com/seibel/distanthorizons/core/network/event/ScopedNetworkEventSource.java index cf690aeb0..84d4b7a01 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/event/ScopedNetworkEventSource.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/event/ScopedNetworkEventSource.java @@ -35,14 +35,14 @@ public final class ScopedNetworkEventSource extends NetworkEventSource } @Override - public void registerHandler(Class handlerClass, Consumer handlerImplementation) + public void registerHandler(Class handlerClass, boolean throwIfMessageNotRegistered, Consumer handlerImplementation) { if (this.isClosed) { return; } - this.parent.registerHandler(this, handlerClass, this::handleMessage); + this.parent.registerHandler(this, handlerClass, throwIfMessageNotRegistered, this::handleMessage); } @Override diff --git a/core/src/main/java/com/seibel/distanthorizons/core/network/session/Session.java b/core/src/main/java/com/seibel/distanthorizons/core/network/session/Session.java index 3527536be..953dce569 100644 --- a/core/src/main/java/com/seibel/distanthorizons/core/network/session/Session.java +++ b/core/src/main/java/com/seibel/distanthorizons/core/network/session/Session.java @@ -66,14 +66,14 @@ public class Session extends NetworkEventSource } @Override - public void registerHandler(Class handlerClass, Consumer handlerImplementation) + public void registerHandler(Class handlerClass, boolean throwIfMessageNotRegistered, Consumer handlerImplementation) { if (this.closeReason.get() != null) { return; } - this.registerHandler(this, handlerClass, handlerImplementation); + this.registerHandler(this, handlerClass, throwIfMessageNotRegistered, handlerImplementation); } public CompletableFuture sendRequest(TrackableMessage msg, Class responseClass)