New network system
This commit is contained in:
@@ -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)));
|
||||
|
||||
|
@@ -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);
|
||||
|
@@ -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) { }
|
||||
}
|
@@ -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();
|
||||
|
@@ -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) {
|
||||
|
@@ -11,6 +11,7 @@ import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
@Deprecated(forRemoval = true)
|
||||
public class FabricClientNetworkHelper extends FabricServerNetworkHelper {
|
||||
|
||||
@Override
|
||||
|
@@ -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) {
|
||||
|
@@ -33,7 +33,7 @@
|
||||
"depends": {
|
||||
"fabricloader": ">=0.14.21",
|
||||
"fabric-api": "*",
|
||||
"minecraft": ">=1.20.3",
|
||||
"minecraft": ">=1.20.4",
|
||||
"java": ">=17"
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user