Skip to content

Commit

Permalink
Fix #3551 Network errors on dedicated server with NeoForge
Browse files Browse the repository at this point in the history
  • Loading branch information
mezz committed Jun 20, 2024
1 parent dc4c0a6 commit 487a5cd
Show file tree
Hide file tree
Showing 4 changed files with 29 additions and 65 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -25,8 +25,7 @@ public JustEnoughItems(IEventBus modEventBus, Dist dist) {
IServerConfig serverConfig = ServerConfig.register(modLoadingContext);

NetworkHandler networkHandler = new NetworkHandler("3", serverConfig);
JustEnoughItemsCommon jeiCommon = new JustEnoughItemsCommon(networkHandler);
jeiCommon.register(subscriptions);
networkHandler.registerPacketHandlers(subscriptions);

JustEnoughItemsClientSafeRunner clientSafeRunner = new JustEnoughItemsClientSafeRunner(networkHandler, subscriptions);
if (dist.isClient()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
import mezz.jei.api.IModPlugin;
import mezz.jei.common.Internal;
import mezz.jei.common.gui.textures.Textures;
import mezz.jei.common.network.IConnectionToServer;
import mezz.jei.gui.config.InternalKeyMappings;
import mezz.jei.library.startup.JeiStarter;
import mezz.jei.library.startup.StartData;
import mezz.jei.neoforge.events.PermanentEventSubscriptions;
import mezz.jei.neoforge.network.ConnectionToServer;
import mezz.jei.neoforge.network.NetworkHandler;
import mezz.jei.neoforge.plugins.neoforge.NeoForgeGuiPlugin;
import mezz.jei.neoforge.startup.ForgePluginFinder;
Expand All @@ -31,13 +31,10 @@ public JustEnoughItemsClient(
) {
this.subscriptions = subscriptions;

ConnectionToServer serverConnection = new ConnectionToServer();
Internal.setServerConnection(serverConnection);

InternalKeyMappings keyMappings = createKeyMappings(subscriptions);
Internal.setKeyMappings(keyMappings);

networkHandler.registerClientPacketHandler(serverConnection, subscriptions);
IConnectionToServer serverConnection = networkHandler.getConnectionToServer();

List<IModPlugin> plugins = ForgePluginFinder.getModPlugins();
StartData startData = new StartData(
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package mezz.jei.neoforge.network;

import mezz.jei.api.constants.ModIds;
import mezz.jei.common.Internal;
import mezz.jei.common.config.IServerConfig;
import mezz.jei.common.network.ClientPacketContext;
import mezz.jei.common.network.IConnectionToClient;
Expand All @@ -17,66 +17,58 @@
import mezz.jei.neoforge.events.PermanentEventSubscriptions;
import net.minecraft.client.player.LocalPlayer;
import net.minecraft.server.level.ServerPlayer;
import net.neoforged.api.distmarker.Dist;
import net.neoforged.api.distmarker.OnlyIn;
import net.neoforged.neoforge.network.event.RegisterPayloadHandlersEvent;
import net.neoforged.neoforge.network.handling.IPayloadHandler;
import net.neoforged.neoforge.network.registration.HandlerThread;

import java.util.function.BiConsumer;

public class NetworkHandler {
private static final String TO_CLIENT_NAMESPACE = ModIds.JEI_ID + "_to_client";
private static final String TO_SERVER_NAMESPACE = ModIds.JEI_ID + "_to_server";

private final String protocolVersion;
private final IServerConfig serverConfig;
private final IConnectionToServer connectionToServer;
private final IConnectionToClient connectionToClient;

public NetworkHandler(String protocolVersion, IServerConfig serverConfig) {
this.protocolVersion = protocolVersion;
this.serverConfig = serverConfig;
}

public void registerServerPacketHandler(IConnectionToClient connection, PermanentEventSubscriptions subscriptions) {
subscriptions.register(RegisterPayloadHandlersEvent.class, ev -> {
var registrar = ev.registrar(TO_CLIENT_NAMESPACE)
.executesOn(HandlerThread.MAIN)
.versioned(this.protocolVersion)
.optional();

registrar.playToServer(PacketDeletePlayerItem.TYPE, PacketDeletePlayerItem.STREAM_CODEC, wrapServerHandler(connection, PacketDeletePlayerItem::process));
registrar.playToServer(PacketGiveItemStack.TYPE, PacketGiveItemStack.STREAM_CODEC, wrapServerHandler(connection, PacketGiveItemStack::process));
registrar.playToServer(PacketRecipeTransfer.TYPE, PacketRecipeTransfer.STREAM_CODEC, wrapServerHandler(connection, PacketRecipeTransfer::process));
registrar.playToServer(PacketSetHotbarItemStack.TYPE, PacketSetHotbarItemStack.STREAM_CODEC, wrapServerHandler(connection, PacketSetHotbarItemStack::process));
registrar.playToServer(PacketRequestCheatPermission.TYPE, PacketRequestCheatPermission.STREAM_CODEC, wrapServerHandler(connection, PacketRequestCheatPermission::process));
});
this.connectionToServer = new ConnectionToServer();
Internal.setServerConnection(this.connectionToServer);
this.connectionToClient = new ConnectionToClient();
}

@OnlyIn(Dist.CLIENT)
public void registerClientPacketHandler(IConnectionToServer connection, PermanentEventSubscriptions subscriptions) {
subscriptions.register(RegisterPayloadHandlersEvent.class, ev -> {
var registrar = ev.registrar(TO_SERVER_NAMESPACE)
.executesOn(HandlerThread.MAIN)
.versioned(this.protocolVersion)
.optional();

registrar.playToClient(PacketCheatPermission.TYPE, PacketCheatPermission.STREAM_CODEC, wrapClientHandler(connection, PacketCheatPermission::process));
});
public void registerPacketHandlers(PermanentEventSubscriptions subscriptions) {
subscriptions.register(RegisterPayloadHandlersEvent.class, ev ->
ev.registrar(this.protocolVersion)
.executesOn(HandlerThread.MAIN)
.optional()
.playToServer(PacketDeletePlayerItem.TYPE, PacketDeletePlayerItem.STREAM_CODEC, wrapServerHandler(PacketDeletePlayerItem::process))
.playToServer(PacketGiveItemStack.TYPE, PacketGiveItemStack.STREAM_CODEC, wrapServerHandler(PacketGiveItemStack::process))
.playToServer(PacketRecipeTransfer.TYPE, PacketRecipeTransfer.STREAM_CODEC, wrapServerHandler(PacketRecipeTransfer::process))
.playToServer(PacketSetHotbarItemStack.TYPE, PacketSetHotbarItemStack.STREAM_CODEC, wrapServerHandler(PacketSetHotbarItemStack::process))
.playToServer(PacketRequestCheatPermission.TYPE, PacketRequestCheatPermission.STREAM_CODEC, wrapServerHandler(PacketRequestCheatPermission::process))
.playToClient(PacketCheatPermission.TYPE, PacketCheatPermission.STREAM_CODEC, wrapClientHandler(PacketCheatPermission::process))
);
}

private <T extends PlayToClientPacket<T>> IPayloadHandler<T> wrapClientHandler(IConnectionToServer connection, BiConsumer<T, ClientPacketContext> consumer) {
private <T extends PlayToClientPacket<T>> IPayloadHandler<T> wrapClientHandler(BiConsumer<T, ClientPacketContext> consumer) {
return (t, payloadContext) -> {
LocalPlayer player = (LocalPlayer) payloadContext.player();
var clientPacketContext = new ClientPacketContext(player, connection);
var clientPacketContext = new ClientPacketContext(player, connectionToServer);
consumer.accept(t, clientPacketContext);
};
}

private <T extends PlayToServerPacket<T>> IPayloadHandler<T> wrapServerHandler(IConnectionToClient connection, BiConsumer<T, ServerPacketContext> consumer) {
private <T extends PlayToServerPacket<T>> IPayloadHandler<T> wrapServerHandler(BiConsumer<T, ServerPacketContext> consumer) {
return (t, payloadContext) -> {
ServerPlayer player = (ServerPlayer) payloadContext.player();
var serverPacketContext = new ServerPacketContext(player, serverConfig, connection);
var serverPacketContext = new ServerPacketContext(player, serverConfig, connectionToClient);
consumer.accept(t, serverPacketContext);
};
}

public IConnectionToServer getConnectionToServer() {
return connectionToServer;
}
}

0 comments on commit 487a5cd

Please sign in to comment.