From 804403ce25db5e4702475d6c2cb4b3133675a82c Mon Sep 17 00:00:00 2001 From: Sollace Date: Thu, 24 Sep 2020 19:59:22 +0200 Subject: [PATCH] Fixed network error sending capabilities to the wrong players --- .../unicopia/entity/player/Pony.java | 6 ++- .../unicopia/network/Channel.java | 37 ++++++++++--------- .../network/MsgOtherPlayerCapabilities.java | 25 +++++++++++++ .../network/MsgPlayerCapabilities.java | 23 ++++++++---- 4 files changed, 64 insertions(+), 27 deletions(-) create mode 100644 src/main/java/com/minelittlepony/unicopia/network/MsgOtherPlayerCapabilities.java diff --git a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java index 7a52180c..755b90f3 100644 --- a/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java +++ b/src/main/java/com/minelittlepony/unicopia/entity/player/Pony.java @@ -22,7 +22,7 @@ import com.minelittlepony.unicopia.item.toxin.Toxicity; import com.minelittlepony.unicopia.item.toxin.Toxin; import com.minelittlepony.unicopia.network.Channel; import com.minelittlepony.unicopia.network.EffectSync; -import com.minelittlepony.unicopia.network.MsgPlayerCapabilities; +import com.minelittlepony.unicopia.network.MsgOtherPlayerCapabilities; import com.minelittlepony.unicopia.network.MsgRequestCapabilities; import com.minelittlepony.unicopia.network.Transmittable; import com.minelittlepony.unicopia.util.Copieable; @@ -149,7 +149,9 @@ public class Pony implements Caster, Equine, Transmi dirty = false; if (entity instanceof ServerPlayerEntity) { - Channel.BROADCAST_CAPABILITIES.send(new MsgPlayerCapabilities(full, this)); + MsgOtherPlayerCapabilities packet = new MsgOtherPlayerCapabilities(full, this); + Channel.SERVER_PLAYER_CAPABILITIES.send(entity, packet); + Channel.SERVER_OTHER_PLAYER_CAPABILITIES.send(entity, packet); } } diff --git a/src/main/java/com/minelittlepony/unicopia/network/Channel.java b/src/main/java/com/minelittlepony/unicopia/network/Channel.java index ab8b2081..dbcbb887 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/Channel.java +++ b/src/main/java/com/minelittlepony/unicopia/network/Channel.java @@ -13,13 +13,9 @@ import net.minecraft.network.PacketByteBuf; public interface Channel { SPacketType> CLIENT_PLAYER_ABILITY = clientToServer(new Identifier("unicopia", "player_ability"), MsgPlayerAbility::new); - SPacketType CLIENT_REQUEST_CAPABILITIES = clientToServer(new Identifier("unicopia", "request_capabilities"), MsgRequestCapabilities::new); - CPacketType SERVER_PLAYER_CAPABILITIES = serverToClient(new Identifier("unicopia", "player_capabilities"), MsgPlayerCapabilities::new); - - SPacketType BROADCAST_CAPABILITIES = broadcast(SERVER_PLAYER_CAPABILITIES, MsgPlayerCapabilities::new); - + MPacketType SERVER_OTHER_PLAYER_CAPABILITIES = serverToClients(new Identifier("unicopia", "other_player_capabilities"), MsgOtherPlayerCapabilities::new); CPacketType SERVER_SPAWN_PROJECTILE = serverToClient(new Identifier("unicopia", "projectile_entity"), MsgSpawnProjectile::new); static void bootstrap() { } @@ -29,19 +25,8 @@ public interface Channel { return () -> id; } - static SPacketType broadcast(CPacketType redirect, Function factory) { - Identifier id = new Identifier(redirect.getId().getNamespace(), "broadcast_" + redirect.getId().getPath()); - ServerSidePacketRegistry.INSTANCE.register(id, (context, buffer) -> { - PlayerEntity sender = context.getPlayer(); - - T p = factory.apply(buffer); - p.handleOnMain(context); - sender.world.getPlayers().forEach(player -> { - if (player != null) { - redirect.send(player, p); - } - }); - }); + static MPacketType serverToClients(Identifier id, Function factory) { + ClientSidePacketRegistry.INSTANCE.register(id, (context, buffer) -> factory.apply(buffer).handleOnMain(context)); return () -> id; } @@ -50,6 +35,22 @@ public interface Channel { return () -> id; } + interface MPacketType { + Identifier getId(); + + default void send(PlayerEntity sender, T packet) { + sender.world.getPlayers().forEach(player -> { + if (player != null) { + ServerSidePacketRegistry.INSTANCE.sendToPlayer(player, getId(), packet.toBuffer()); + } + }); + } + + default net.minecraft.network.Packet toPacket(T packet) { + return ServerSidePacketRegistry.INSTANCE.toPacket(getId(), packet.toBuffer()); + } + } + interface CPacketType { Identifier getId(); diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgOtherPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgOtherPlayerCapabilities.java new file mode 100644 index 00000000..e98c2ecc --- /dev/null +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgOtherPlayerCapabilities.java @@ -0,0 +1,25 @@ +package com.minelittlepony.unicopia.network; + +import com.minelittlepony.unicopia.entity.player.Pony; + +import net.fabricmc.fabric.api.network.PacketContext; +import net.minecraft.client.MinecraftClient; +import net.minecraft.network.PacketByteBuf; + +public class MsgOtherPlayerCapabilities extends MsgPlayerCapabilities { + + MsgOtherPlayerCapabilities(PacketByteBuf buffer) { + super(buffer); + + } + + public MsgOtherPlayerCapabilities(boolean full, Pony player) { + super(full, player); + + } + + @Override + protected Pony getRecipient(PacketContext context) { + return Pony.of(MinecraftClient.getInstance().world.getPlayerByUuid(playerId)); + } +} diff --git a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java index fc7c3c4c..14582af6 100644 --- a/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java +++ b/src/main/java/com/minelittlepony/unicopia/network/MsgPlayerCapabilities.java @@ -3,24 +3,29 @@ package com.minelittlepony.unicopia.network; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.UUID; + import com.minelittlepony.unicopia.Race; +import com.minelittlepony.unicopia.Unicopia; import com.minelittlepony.unicopia.entity.player.Pony; import io.netty.buffer.ByteBufInputStream; import io.netty.buffer.ByteBufOutputStream; import net.fabricmc.fabric.api.network.PacketContext; -import net.minecraft.entity.player.PlayerEntity; import net.minecraft.network.PacketByteBuf; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtIo; public class MsgPlayerCapabilities implements Channel.Packet { + protected final UUID playerId; + private final Race newRace; private final CompoundTag compoundTag; MsgPlayerCapabilities(PacketByteBuf buffer) { + playerId = buffer.readUuid(); newRace = Race.values()[buffer.readInt()]; try (InputStream in = new ByteBufInputStream(buffer)) { compoundTag = NbtIo.readCompressed(in); @@ -29,18 +34,15 @@ public class MsgPlayerCapabilities implements Channel.Packet { } } - public MsgPlayerCapabilities(Race race, PlayerEntity player) { - newRace = race; - compoundTag = new CompoundTag(); - } - public MsgPlayerCapabilities(boolean full, Pony player) { + playerId = player.getOwner().getUuid(); newRace = player.getSpecies(); compoundTag = full ? player.toNBT() : new CompoundTag(); } @Override public void toBuffer(PacketByteBuf buffer) { + buffer.writeUuid(playerId); buffer.writeInt(newRace.ordinal()); try (OutputStream out = new ByteBufOutputStream(buffer)) { NbtIo.writeCompressed(compoundTag, out); @@ -50,11 +52,18 @@ public class MsgPlayerCapabilities implements Channel.Packet { @Override public void handle(PacketContext context) { - Pony player = Pony.of(context.getPlayer()); + Pony player = getRecipient(context); + if (player == null) { + Unicopia.LOGGER.warn("Skipping capabilities for unknown player " + playerId.toString()); + } if (compoundTag.isEmpty()) { player.setSpecies(newRace); } else { player.fromNBT(compoundTag); } } + + protected Pony getRecipient(PacketContext context) { + return Pony.of(context.getPlayer()); + } }