Fix missing packet issue on NeoForge

This commit is contained in:
shedaniel
2024-01-09 22:15:58 +09:00
parent 760b2a790e
commit 4041bcd4fb
3 changed files with 58 additions and 42 deletions

View File

@@ -20,8 +20,11 @@
package dev.architectury.neoforge;
import dev.architectury.event.EventHandler;
import dev.architectury.networking.SpawnEntityPacket;
import dev.architectury.registry.level.biome.forge.BiomeModificationsImpl;
import dev.architectury.utils.ArchitecturyConstants;
import dev.architectury.utils.Env;
import dev.architectury.utils.EnvExecutor;
import net.neoforged.fml.common.Mod;
@Mod(ArchitecturyConstants.MOD_ID)
@@ -29,5 +32,7 @@ public class ArchitecturyNeoForge {
public ArchitecturyNeoForge() {
EventHandler.init();
BiomeModificationsImpl.init();
EnvExecutor.runInEnv(Env.CLIENT, () -> SpawnEntityPacket.Client::register);
}
}

View File

@@ -26,10 +26,15 @@ import net.minecraft.resources.ResourceLocation;
/**
* Wraps a {@link FriendlyByteBuf} because NeoForge doesn't easily let us use the buf directly.
*/
public record BufCustomPacketPayload(FriendlyByteBuf buf) implements CustomPacketPayload {
public record BufCustomPacketPayload(ResourceLocation type, byte[] payload) implements CustomPacketPayload {
public BufCustomPacketPayload(FriendlyByteBuf buf) {
this(buf.readResourceLocation(), buf.readByteArray());
}
@Override
public void write(FriendlyByteBuf arg) {
arg.writeBytes(buf);
public void write(FriendlyByteBuf buf) {
buf.writeResourceLocation(type);
buf.writeByteArray(payload);
}
@SuppressWarnings("NullableProblems")

View File

@@ -30,6 +30,7 @@ import dev.architectury.networking.transformers.PacketTransformer;
import dev.architectury.platform.hooks.forge.EventBusesHooksImpl;
import dev.architectury.utils.ArchitecturyConstants;
import dev.architectury.utils.Env;
import io.netty.buffer.ByteBufUtil;
import io.netty.buffer.Unpooled;
import net.minecraft.network.FriendlyByteBuf;
import net.minecraft.network.protocol.Packet;
@@ -70,10 +71,11 @@ public class NetworkManagerImpl {
}
public static Packet<?> toPacket(NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buffer) {
FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer());
packetBuffer.writeResourceLocation(id);
packetBuffer.writeBytes(buffer);
return side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer));
try {
return side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(id, ByteBufUtil.getBytes(buffer))) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(id, ByteBufUtil.getBytes(buffer)));
} finally {
buffer.release();
}
}
public static void collectPackets(PacketSink sink, NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buf) {
@@ -107,41 +109,46 @@ public class NetworkManagerImpl {
return (arg, context) -> {
NetworkManager.Side side = side(context.flow());
if (side != direction) return;
ResourceLocation type = arg.buf().readResourceLocation();
ResourceLocation type = arg.type();
FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(arg.payload()));
PacketTransformer transformer = map.get(type);
if (transformer != null) {
NetworkManager.PacketContext packetContext = new NetworkManager.PacketContext() {
@Override
public Player getPlayer() {
return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.player().orElse(null);
}
try {
if (transformer != null) {
NetworkManager.PacketContext packetContext = new NetworkManager.PacketContext() {
@Override
public Player getPlayer() {
return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.player().orElse(null);
}
@Override
public void queue(Runnable runnable) {
context.workHandler().submitAsync(runnable);
}
@Override
public Env getEnvironment() {
return context.flow().getReceptionSide() == LogicalSide.CLIENT ? Env.CLIENT : Env.SERVER;
}
@SuppressWarnings("removal")
private Player getClientPlayer() {
return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::getClientPlayer);
}
};
@Override
public void queue(Runnable runnable) {
context.workHandler().submitAsync(runnable);
}
@Override
public Env getEnvironment() {
return context.flow().getReceptionSide() == LogicalSide.CLIENT ? Env.CLIENT : Env.SERVER;
}
@SuppressWarnings("removal")
private Player getClientPlayer() {
return DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::getClientPlayer);
}
};
transformer.inbound(side, type, arg.buf(), packetContext, (side1, id1, buf1) -> {
NetworkReceiver networkReceiver = side == NetworkManager.Side.C2S ? C2S.get(id1) : S2C.get(id1);
if (networkReceiver == null) {
throw new IllegalArgumentException("Network Receiver not found! " + id1);
}
networkReceiver.receive(buf1, packetContext);
});
} else {
LOGGER.error("Unknown message ID: " + type);
transformer.inbound(side, type, buf, packetContext, (side1, id1, buf1) -> {
NetworkReceiver networkReceiver = side == NetworkManager.Side.C2S ? C2S.get(id1) : S2C.get(id1);
if (networkReceiver == null) {
throw new IllegalArgumentException("Network Receiver not found! " + id1);
}
networkReceiver.receive(buf1, packetContext);
});
} else {
LOGGER.error("Unknown message ID: " + type);
}
} finally {
buf.release();
}
};
}
@@ -201,12 +208,11 @@ public class NetworkManagerImpl {
@Nullable
IPlayPayloadHandler<BufCustomPacketPayload> s2c = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::initClient);
IPayloadRegistrar registrar = event.registrar("architectury")/*.versioned(Platform.getMod("architectury-api").getVersion())*/.optional();
IPayloadRegistrar registrar = event.registrar(ArchitecturyConstants.MOD_ID).optional();
registrar.play(CHANNEL_ID, BufCustomPacketPayload::new, builder -> {
builder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(s2c);
builder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(Objects.requireNonNullElseGet(s2c, IPlayPayloadHandler::noop));
});
registerC2SReceiver(SYNC_IDS, Collections.emptyList(), (buffer, context) -> {
Set<ResourceLocation> receivables = (Set<ResourceLocation>) clientReceivables.get(context.getPlayer());
int size = buffer.readInt();