Fix Fabric Networking issues resulting in server crash and undelivered packets

This commit is contained in:
2023-05-30 18:54:04 +02:00
parent 5a1492a25a
commit d7a67ee3d5
11 changed files with 95 additions and 25 deletions

View File

@@ -82,14 +82,6 @@ public class FabricClientHelper implements LibClientHelper {
return Minecraft.getInstance().getConnection().getConnection();
}
@Override
public void registerClientReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory) {
ClientPlayNetworking.registerGlobalReceiver(channelName, (Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) -> {
CraterPacket<?> packet = factory.apply(buf);
client.execute(() -> packet.handle(client.player, client));
});
}
public static void registerCreativeItems(CreativeModeTab tab, FabricItemGroupEntries entries) {
}

View File

@@ -0,0 +1,2 @@
package com.hypherionmc.craterlib.client;public class FabricNetworkHelper {
}

View File

@@ -47,14 +47,6 @@ public class FabricCommonHelper implements LibCommonHelper {
return server;
}
@Override
public void registerServerReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory) {
ServerPlayNetworking.registerGlobalReceiver(channelName, (MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) -> {
CraterPacket<?> packet = factory.apply(buf);
server.execute(() -> packet.handle(player, server));
});
}
@Override
public void openMenu(ServerPlayer player, MenuProvider menu, Consumer<FriendlyByteBuf> initialData) {
ExtendedScreenHandlerFactory factory = new ExtendedScreenHandlerFactory() {

View File

@@ -9,6 +9,7 @@ import com.hypherionmc.craterlib.core.platform.Platform;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketByteBufs;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.Util;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.Packet;
@@ -44,8 +45,8 @@ public class FabricNetworkHandler implements CraterNetworkHandler {
final Function<FriendlyByteBuf, CraterPacket<?>> decoder = buf -> Util.make(supplier.get(), message -> message.read(buf));
switch (packetDirection) {
case TO_CLIENT -> ClientPlatform.CLIENT_HELPER.registerClientReceiver(channelName, decoder);
case TO_SERVER -> Platform.COMMON_HELPER.registerServerReceiver(channelName, decoder);
case TO_CLIENT -> FabricNetworkHelper.getForDist(FabricLoader.getInstance().getEnvironmentType()).registerClientReceiver(channelName, decoder);
case TO_SERVER -> FabricNetworkHelper.getForDist(FabricLoader.getInstance().getEnvironmentType()).registerServerReceiver(channelName, decoder);
}
}

View File

@@ -0,0 +1,31 @@
package com.hypherionmc.craterlib.network;
import com.hypherionmc.craterlib.core.network.CraterPacket;
import com.hypherionmc.craterlib.network.impl.FabricClientNetworkHelper;
import com.hypherionmc.craterlib.network.impl.FabricServerNetworkHelper;
import net.fabricmc.api.EnvType;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
public interface FabricNetworkHelper {
/* FABRIC ONLY */
void registerClientReceiver(@NotNull ResourceLocation channelName, @NotNull Function<FriendlyByteBuf, @NotNull CraterPacket<?>> factory);
void registerServerReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory);
public static FabricNetworkHelper getForDist(EnvType dist) {
switch (dist) {
case CLIENT -> {
return new FabricClientNetworkHelper();
}
case SERVER -> {
return new FabricServerNetworkHelper();
}
}
return null;
}
}

View File

@@ -0,0 +1,28 @@
package com.hypherionmc.craterlib.network.impl;
import com.hypherionmc.craterlib.core.network.CraterPacket;
import com.hypherionmc.craterlib.network.FabricNetworkHelper;
import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.minecraft.client.Minecraft;
import net.minecraft.client.multiplayer.ClientPacketListener;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import java.util.function.Function;
public class FabricClientNetworkHelper implements FabricNetworkHelper {
@Override
public void registerClientReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory) {
ClientPlayNetworking.registerGlobalReceiver(channelName, (Minecraft client, ClientPacketListener handler, FriendlyByteBuf buf, PacketSender responseSender) -> {
CraterPacket<?> packet = factory.apply(buf);
client.execute(() -> packet.handle(client.player, client));
});
}
@Override
public void registerServerReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory) {
}
}

View File

@@ -0,0 +1,29 @@
package com.hypherionmc.craterlib.network.impl;
import com.hypherionmc.craterlib.core.network.CraterPacket;
import com.hypherionmc.craterlib.network.FabricNetworkHelper;
import net.fabricmc.fabric.api.networking.v1.PacketSender;
import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.MinecraftServer;
import net.minecraft.server.level.ServerPlayer;
import net.minecraft.server.network.ServerGamePacketListenerImpl;
import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
public class FabricServerNetworkHelper implements FabricNetworkHelper {
@Override
public void registerClientReceiver(@NotNull ResourceLocation channelName, @NotNull Function<FriendlyByteBuf, @NotNull CraterPacket<?>> factory) {
}
@Override
public void registerServerReceiver(ResourceLocation channelName, Function<FriendlyByteBuf, CraterPacket<?>> factory) {
ServerPlayNetworking.registerGlobalReceiver(channelName, (MinecraftServer server, ServerPlayer player, ServerGamePacketListenerImpl handler, FriendlyByteBuf buf, PacketSender responseSender) -> {
CraterPacket<?> packet = factory.apply(buf);
server.execute(() -> packet.handle(player, server));
});
}
}