Switch to the new networking api

This commit is contained in:
Sollace 2021-02-10 18:33:21 +02:00
parent 62ca1de596
commit 5d6206ffc5
7 changed files with 46 additions and 50 deletions

View file

@ -4,14 +4,15 @@ import java.util.function.Function;
import io.netty.buffer.Unpooled; import io.netty.buffer.Unpooled;
import net.fabricmc.api.EnvType; import net.fabricmc.api.EnvType;
import net.fabricmc.fabric.api.network.ClientSidePacketRegistry; import net.fabricmc.fabric.api.client.networking.v1.ClientPlayNetworking;
import net.fabricmc.fabric.api.network.PacketContext; import net.fabricmc.fabric.api.networking.v1.ServerPlayNetworking;
import net.fabricmc.fabric.api.network.ServerSidePacketRegistry;
import net.fabricmc.loader.api.FabricLoader; import net.fabricmc.loader.api.FabricLoader;
import net.minecraft.entity.player.PlayerEntity; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.util.thread.ThreadExecutor;
import net.minecraft.world.World; import net.minecraft.world.World;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.network.ServerPlayerEntity;
public interface Channel { public interface Channel {
@ -27,20 +28,26 @@ public interface Channel {
static void bootstrap() { } static void bootstrap() { }
static <T extends Packet> SPacketType<T> clientToServer(Identifier id, Function<PacketByteBuf, T> factory) { static <T extends Packet> SPacketType<T> clientToServer(Identifier id, Function<PacketByteBuf, T> factory) {
ServerSidePacketRegistry.INSTANCE.register(id, (context, buffer) -> factory.apply(buffer).handleOnMain(context)); ServerPlayNetworking.registerGlobalReceiver(id, (server, player, handler, buffer, responder) -> {
return () -> id; factory.apply(buffer).handleOnMain(server, player);
} });
static <T extends Packet> MPacketType<T> serverToClients(Identifier id, Function<PacketByteBuf, T> factory) {
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
ClientSidePacketRegistry.INSTANCE.register(id, (context, buffer) -> factory.apply(buffer).handleOnMain(context));
}
return () -> id; return () -> id;
} }
static <T extends Packet> CPacketType<T> serverToClient(Identifier id, Function<PacketByteBuf, T> factory) { static <T extends Packet> CPacketType<T> serverToClient(Identifier id, Function<PacketByteBuf, T> factory) {
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) { if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
ClientSidePacketRegistry.INSTANCE.register(id, (context, buffer) -> factory.apply(buffer).handleOnMain(context)); ClientPlayNetworking.registerGlobalReceiver(id, (client, ignore1, buffer, ignore2) -> {
factory.apply(buffer).handleOnMain(client, client.player);
});
}
return () -> id;
}
static <T extends Packet> MPacketType<T> serverToClients(Identifier id, Function<PacketByteBuf, T> factory) {
if (FabricLoader.getInstance().getEnvironmentType() == EnvType.CLIENT) {
ClientPlayNetworking.registerGlobalReceiver(id, (client, ignore1, buffer, ignore2) -> {
factory.apply(buffer).handleOnMain(client, client.player);
});
} }
return () -> id; return () -> id;
} }
@ -51,25 +58,21 @@ public interface Channel {
default void send(World world, T packet) { default void send(World world, T packet) {
world.getPlayers().forEach(player -> { world.getPlayers().forEach(player -> {
if (player != null) { if (player != null) {
ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, getId(), packet.toBuffer()); ServerPlayNetworking.send((ServerPlayerEntity)player, getId(), packet.toBuffer());
} }
}); });
} }
default net.minecraft.network.Packet<?> toPacket(T packet) {
return ServerSidePacketRegistry.INSTANCE.toPacket(getId(), packet.toBuffer());
}
} }
interface CPacketType<T extends Packet> { interface CPacketType<T extends Packet> {
Identifier getId(); Identifier getId();
default void send(PlayerEntity recipient, T packet) { default void send(PlayerEntity recipient, T packet) {
ServerSidePacketRegistry.INSTANCE.sendToPlayer(recipient, getId(), packet.toBuffer()); ServerPlayNetworking.send((ServerPlayerEntity)recipient, getId(), packet.toBuffer());
} }
default net.minecraft.network.Packet<?> toPacket(T packet) { default net.minecraft.network.Packet<?> toPacket(T packet) {
return ServerSidePacketRegistry.INSTANCE.toPacket(getId(), packet.toBuffer()); return ServerPlayNetworking.createS2CPacket(getId(), packet.toBuffer());
} }
} }
@ -80,24 +83,17 @@ public interface Channel {
if (FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT) { if (FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT) {
throw new RuntimeException("Client packet send called by the server"); throw new RuntimeException("Client packet send called by the server");
} }
ClientSidePacketRegistry.INSTANCE.sendToServer(getId(), packet.toBuffer()); ClientPlayNetworking.send(getId(), packet.toBuffer());
}
default net.minecraft.network.Packet<?> toPacket(T packet) {
if (FabricLoader.getInstance().getEnvironmentType() != EnvType.CLIENT) {
throw new RuntimeException("Client packet send called by the server");
}
return ClientSidePacketRegistry.INSTANCE.toPacket(getId(), packet.toBuffer());
} }
} }
interface Packet { interface Packet {
void handle(PacketContext context); void handle(PlayerEntity sender);
void toBuffer(PacketByteBuf buffer); void toBuffer(PacketByteBuf buffer);
default void handleOnMain(PacketContext context) { default void handleOnMain(ThreadExecutor<?> server, PlayerEntity player) {
context.getTaskQueue().execute(() -> handle(context)); server.execute(() -> handle(player));
} }
default PacketByteBuf toBuffer() { default PacketByteBuf toBuffer() {

View file

@ -4,9 +4,9 @@ import com.minelittlepony.unicopia.client.ClientBlockDestructionManager;
import it.unimi.dsi.fastutil.longs.Long2ObjectMap; import it.unimi.dsi.fastutil.longs.Long2ObjectMap;
import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap; import it.unimi.dsi.fastutil.longs.Long2ObjectOpenHashMap;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity;
public class MsgBlockDestruction implements Channel.Packet { public class MsgBlockDestruction implements Channel.Packet {
@ -34,7 +34,7 @@ public class MsgBlockDestruction implements Channel.Packet {
} }
@Override @Override
public void handle(PacketContext context) { public void handle(PlayerEntity sender) {
ClientBlockDestructionManager destr = ((ClientBlockDestructionManager.Source)MinecraftClient.getInstance().worldRenderer).getDestructionManager(); ClientBlockDestructionManager destr = ((ClientBlockDestructionManager.Source)MinecraftClient.getInstance().worldRenderer).getDestructionManager();
destructions.forEach((i, d) -> { destructions.forEach((i, d) -> {

View file

@ -2,8 +2,8 @@ package com.minelittlepony.unicopia.network;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
public class MsgOtherPlayerCapabilities extends MsgPlayerCapabilities { public class MsgOtherPlayerCapabilities extends MsgPlayerCapabilities {
@ -19,7 +19,7 @@ public class MsgOtherPlayerCapabilities extends MsgPlayerCapabilities {
} }
@Override @Override
protected Pony getRecipient(PacketContext context) { protected Pony getRecipient(PlayerEntity sender) {
return Pony.of(MinecraftClient.getInstance().world.getPlayerByUuid(playerId)); return Pony.of(MinecraftClient.getInstance().world.getPlayerByUuid(playerId));
} }
} }

View file

@ -5,8 +5,8 @@ import com.minelittlepony.unicopia.ability.data.Hit;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import com.minelittlepony.unicopia.ability.Abilities; import com.minelittlepony.unicopia.ability.Abilities;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.util.Identifier; import net.minecraft.util.Identifier;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
public class MsgPlayerAbility<T extends Hit> implements Channel.Packet { public class MsgPlayerAbility<T extends Hit> implements Channel.Packet {
@ -33,8 +33,8 @@ public class MsgPlayerAbility<T extends Hit> implements Channel.Packet {
} }
@Override @Override
public void handle(PacketContext context) { public void handle(PlayerEntity sender) {
Pony player = Pony.of(context.getPlayer()); Pony player = Pony.of(sender);
if (player == null) { if (player == null) {
return; return;
} }

View file

@ -11,8 +11,8 @@ import com.minelittlepony.unicopia.entity.player.Pony;
import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufInputStream;
import io.netty.buffer.ByteBufOutputStream; import io.netty.buffer.ByteBufOutputStream;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.NbtIo; import net.minecraft.nbt.NbtIo;
@ -51,8 +51,8 @@ public class MsgPlayerCapabilities implements Channel.Packet {
} }
@Override @Override
public void handle(PacketContext context) { public void handle(PlayerEntity sender) {
Pony player = getRecipient(context); Pony player = getRecipient(sender);
if (player == null) { if (player == null) {
Unicopia.LOGGER.warn("Skipping capabilities for unknown player " + playerId.toString()); Unicopia.LOGGER.warn("Skipping capabilities for unknown player " + playerId.toString());
} }
@ -63,7 +63,7 @@ public class MsgPlayerCapabilities implements Channel.Packet {
} }
} }
protected Pony getRecipient(PacketContext context) { protected Pony getRecipient(PlayerEntity sender) {
return Pony.of(context.getPlayer()); return Pony.of(sender);
} }
} }

View file

@ -4,7 +4,7 @@ import com.minelittlepony.unicopia.Race;
import com.minelittlepony.unicopia.WorldTribeManager; import com.minelittlepony.unicopia.WorldTribeManager;
import com.minelittlepony.unicopia.entity.player.Pony; import com.minelittlepony.unicopia.entity.player.Pony;
import net.fabricmc.fabric.api.network.PacketContext; import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.server.world.ServerWorld; import net.minecraft.server.world.ServerWorld;
@ -26,15 +26,15 @@ public class MsgRequestCapabilities implements Channel.Packet {
} }
@Override @Override
public void handle(PacketContext context) { public void handle(PlayerEntity sender) {
Pony player = Pony.of(context.getPlayer()); Pony player = Pony.of(sender);
Race worldDefaultRace = WorldTribeManager.forWorld((ServerWorld)player.getWorld()).getDefaultRace(); Race worldDefaultRace = WorldTribeManager.forWorld((ServerWorld)player.getWorld()).getDefaultRace();
if (player.getSpecies().isDefault() || (player.getSpecies() == worldDefaultRace && !player.isSpeciesPersisted())) { if (player.getSpecies().isDefault() || (player.getSpecies() == worldDefaultRace && !player.isSpeciesPersisted())) {
player.setSpecies(clientPreferredRace.isPermitted(context.getPlayer()) ? clientPreferredRace : worldDefaultRace); player.setSpecies(clientPreferredRace.isPermitted(sender) ? clientPreferredRace : worldDefaultRace);
} }
Channel.SERVER_PLAYER_CAPABILITIES.send(context.getPlayer(), new MsgPlayerCapabilities(true, player)); Channel.SERVER_PLAYER_CAPABILITIES.send(sender, new MsgPlayerCapabilities(true, player));
} }
} }

View file

@ -5,9 +5,9 @@ import java.util.Optional;
import com.minelittlepony.unicopia.Owned; import com.minelittlepony.unicopia.Owned;
import net.fabricmc.fabric.api.network.PacketContext;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.entity.Entity; import net.minecraft.entity.Entity;
import net.minecraft.entity.player.PlayerEntity;
import net.minecraft.network.PacketByteBuf; import net.minecraft.network.PacketByteBuf;
import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket; import net.minecraft.network.packet.s2c.play.EntitySpawnS2CPacket;
import net.minecraft.world.World; import net.minecraft.world.World;
@ -35,8 +35,8 @@ public class MsgSpawnProjectile extends EntitySpawnS2CPacket implements Channel.
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
@Override @Override
public void handle(PacketContext context) { public void handle(PlayerEntity sender) {
World world = context.getPlayer().world; World world = sender.world;
Entity entity = getEntityTypeId().create(world); Entity entity = getEntityTypeId().create(world);
entity.updateTrackedPosition(getX(), getY(), getZ()); entity.updateTrackedPosition(getX(), getY(), getZ());