New network system

This commit is contained in:
2024-01-02 15:16:13 +02:00
parent 1dad912ec1
commit 0813bc416c
30 changed files with 517 additions and 107 deletions

View File

@@ -4,6 +4,9 @@ import com.hypherionmc.craterlib.api.event.server.CraterRegisterCommandEvent;
import com.hypherionmc.craterlib.api.event.server.CraterServerLifecycleEvent;
import com.hypherionmc.craterlib.common.FabricCommonPlatform;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import net.fabricmc.api.ModInitializer;
import net.fabricmc.fabric.api.command.v2.CommandRegistrationCallback;
import net.fabricmc.fabric.api.event.lifecycle.v1.ServerLifecycleEvents;
@@ -12,6 +15,7 @@ public class CraterLibInitializer implements ModInitializer {
@Override
public void onInitialize() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.SERVER));
CommandRegistrationCallback.EVENT.register(
(dispatcher, registryAccess, environment) -> CraterEventBus.INSTANCE.postEvent(new CraterRegisterCommandEvent(dispatcher)));

View File

@@ -2,6 +2,9 @@ package com.hypherionmc.craterlib.client;
import com.hypherionmc.craterlib.api.event.client.CraterClientTickEvent;
import com.hypherionmc.craterlib.core.event.CraterEventBus;
import com.hypherionmc.craterlib.core.networking.CraterPacketNetwork;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
import com.hypherionmc.craterlib.network.CraterFabricNetworkHandler;
import net.fabricmc.api.ClientModInitializer;
import net.fabricmc.fabric.api.client.event.lifecycle.v1.ClientTickEvents;
@@ -9,6 +12,7 @@ public class CraterLibClientInitializer implements ClientModInitializer {
@Override
public void onInitializeClient() {
new CraterPacketNetwork(new CraterFabricNetworkHandler(PacketSide.CLIENT));
ClientTickEvents.START_CLIENT_TICK.register((listener) -> {
CraterClientTickEvent event = new CraterClientTickEvent(listener.level);
CraterEventBus.INSTANCE.postEvent(event);

View File

@@ -0,0 +1,81 @@
package com.hypherionmc.craterlib.network;
import com.hypherionmc.craterlib.CraterConstants;
import com.hypherionmc.craterlib.core.networking.PacketRegistry;
import com.hypherionmc.craterlib.core.networking.data.PacketContext;
import com.hypherionmc.craterlib.core.networking.data.PacketHolder;
import com.hypherionmc.craterlib.core.networking.data.PacketSide;
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.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.level.ServerPlayer;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
/**
* Based on https://github.com/mysticdrew/common-networking/tree/1.20.4
*/
public class CraterFabricNetworkHandler extends PacketRegistry {
private final Map<Class<?>, Message<?>> CHANNELS = new HashMap();
public CraterFabricNetworkHandler(PacketSide side) {
super(side);
}
protected <T> void registerPacket(PacketHolder<T> holder) {
if (CHANNELS.get(holder.messageType()) == null) {
CHANNELS.put(holder.messageType(), new Message<>(holder.packetId(), holder.encoder()));
if (PacketSide.CLIENT.equals(this.side)) {
ClientPlayNetworking.registerGlobalReceiver(holder.packetId(), ((client, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(buf);
client.execute(() -> holder.handler().accept(new PacketContext<>(message, PacketSide.CLIENT)));
}));
} else {
ServerPlayNetworking.registerGlobalReceiver(holder.packetId(), ((server, player, listener, buf, responseSender) -> {
buf.readByte();
T message = holder.decoder().apply(buf);
server.execute(() -> holder.handler().accept(new PacketContext<>(player, message, PacketSide.SERVER)));
}));
}
} else {
CraterConstants.LOG.error("Trying to register duplicate packet for type {}", holder.messageType());
}
}
public <T> void sendToServer(T packet) {
this.sendToServer(packet, false);
}
public <T> void sendToServer(T packet, boolean ignoreCheck) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ClientPlayNetworking.canSend(message.id()) || ignoreCheck) {
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, buf);
ClientPlayNetworking.send(message.id(), buf);
}
}
public <T> void sendToClient(T packet, ServerPlayer player) {
Message<T> message = (Message<T>) CHANNELS.get(packet.getClass());
if (ServerPlayNetworking.canSend(player, message.id()))
{
FriendlyByteBuf buf = PacketByteBufs.create();
buf.writeByte(0);
message.encoder().accept(packet, buf);
ServerPlayNetworking.send(player, message.id(), buf);
}
}
public record Message<T>(ResourceLocation id, BiConsumer<T, FriendlyByteBuf> encoder) { }
}

View File

@@ -23,6 +23,7 @@ import java.util.function.Supplier;
* @author HypherionSA
* @date 24/09/2022
*/
@Deprecated(forRemoval = true)
public class FabricNetworkHandler implements CraterNetworkHandler {
private static final Map<String, FabricNetworkHandler> NETWORK_HANDLERS = Maps.newConcurrentMap();

View File

@@ -10,6 +10,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@Deprecated(forRemoval = true)
public interface FabricNetworkHelper {
public static FabricNetworkHelper getForDist(EnvType dist) {

View File

@@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@Deprecated(forRemoval = true)
public class FabricClientNetworkHelper extends FabricServerNetworkHelper {
@Override

View File

@@ -13,6 +13,7 @@ import org.jetbrains.annotations.NotNull;
import java.util.function.Function;
@Deprecated(forRemoval = true)
public class FabricServerNetworkHelper implements FabricNetworkHelper {
@Override
public void registerClientReceiver(@NotNull ResourceLocation channelName, @NotNull Function<FriendlyByteBuf, @NotNull CraterPacket<?>> factory) {

View File

@@ -33,7 +33,7 @@
"depends": {
"fabricloader": ">=0.14.21",
"fabric-api": "*",
"minecraft": ">=1.20.3",
"minecraft": ">=1.20.4",
"java": ">=17"
}
}