Add support for PacketTransformer and a SplitPacketTransformer (#142)

* Add support for PacketTransformer and a SplitPacketTransformer

* Add testmod and make it work

* Add experimental, Remove generics, they are pointless
This commit is contained in:
shedaniel
2021-10-23 18:27:28 +08:00
committed by GitHub
parent f636b1ad96
commit a6a361e5e1
12 changed files with 661 additions and 35 deletions

View File

@@ -27,9 +27,9 @@ import dev.architectury.test.debug.client.ClientOverlayMessageSink;
import dev.architectury.test.entity.TestEntity;
import dev.architectury.test.events.DebugEvents;
import dev.architectury.test.gamerule.TestGameRules;
import dev.architectury.test.item.TestBlockInteractions;
import dev.architectury.test.networking.TestModNet;
import dev.architectury.test.particle.TestParticles;
import dev.architectury.test.item.TestBlockInteractions;
import dev.architectury.test.registry.TestRegistries;
import dev.architectury.test.registry.client.TestKeybinds;
import dev.architectury.test.tags.TestTags;
@@ -62,6 +62,7 @@ public class TestMod {
@Environment(EnvType.CLIENT)
public static void initializeClient() {
TestKeybinds.initialize();
TestModNet.initializeClient();
EntityRendererRegistry.register(TestEntity.TYPE, context ->
new MinecartRenderer<>(context, ModelLayers.MINECART));
}

View File

@@ -19,9 +19,18 @@
package dev.architectury.test.networking;
import dev.architectury.event.events.client.ClientPlayerEvent;
import dev.architectury.networking.NetworkManager;
import dev.architectury.networking.simple.MessageType;
import dev.architectury.networking.simple.SimpleNetworkManager;
import dev.architectury.networking.transformers.SplitPacketTransformer;
import dev.architectury.test.TestMod;
import io.netty.buffer.Unpooled;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.resources.ResourceLocation;
import org.apache.commons.lang3.StringUtils;
import java.util.Collections;
public interface TestModNet {
SimpleNetworkManager NET = SimpleNetworkManager.create(TestMod.MOD_ID);
@@ -31,7 +40,33 @@ public interface TestModNet {
// An example Server to Client message
MessageType SYNC_DATA = NET.registerS2C("sync_data", SyncDataMessage::new);
ResourceLocation BIG_DATA = new ResourceLocation(TestMod.MOD_ID, "big_data");
String BIG_STRING = StringUtils.repeat('a', 60000);
static void initialize() {
NetworkManager.registerReceiver(NetworkManager.Side.C2S, BIG_DATA, Collections.singletonList(new SplitPacketTransformer()), (buf, context) -> {
String utf = buf.readUtf(Integer.MAX_VALUE / 4);
if (utf.equals(BIG_STRING)) {
TestMod.SINK.accept("Network Split Packets worked");
} else {
throw new AssertionError(utf);
}
utf = buf.readUtf(Integer.MAX_VALUE / 4);
if (utf.equals(BIG_STRING)) {
TestMod.SINK.accept("Network Split Packets worked");
} else {
throw new AssertionError(utf);
}
});
}
static void initializeClient() {
ClientPlayerEvent.CLIENT_PLAYER_JOIN.register(player -> {
FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer());
buf.writeUtf(BIG_STRING, Integer.MAX_VALUE / 4);
// write twice
buf.writeUtf(BIG_STRING, Integer.MAX_VALUE / 4);
NetworkManager.sendToServer(BIG_DATA, buf);
});
}
}