diff --git a/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java b/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java index 84d2abe86..a2f22d2e7 100644 --- a/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java +++ b/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java @@ -18,14 +18,12 @@ */ package dev.architectury.hooks.level; - import dev.architectury.injectables.annotations.ExpectPlatform; import net.minecraft.world.level.Explosion; import net.minecraft.world.phys.Vec3; /** * @deprecated no longer needed. - * */ @Deprecated(forRemoval = true) public final class ExplosionHooks { diff --git a/fabric/src/main/java/dev/architectury/networking/fabric/SpawnEntityPacket.java b/common/src/main/java/dev/architectury/networking/SpawnEntityPacket.java similarity index 96% rename from fabric/src/main/java/dev/architectury/networking/fabric/SpawnEntityPacket.java rename to common/src/main/java/dev/architectury/networking/SpawnEntityPacket.java index 2d0435d02..c5b6e73d3 100644 --- a/fabric/src/main/java/dev/architectury/networking/fabric/SpawnEntityPacket.java +++ b/common/src/main/java/dev/architectury/networking/SpawnEntityPacket.java @@ -17,13 +17,12 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.networking.fabric; +package dev.architectury.networking; import dev.architectury.extensions.network.EntitySpawnExtension; -import dev.architectury.networking.NetworkManager; +import io.netty.buffer.Unpooled; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; -import net.fabricmc.fabric.api.networking.v1.PacketByteBufs; import net.minecraft.client.Minecraft; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.network.FriendlyByteBuf; @@ -42,7 +41,7 @@ public static Packet create(Entity entity) { if (entity.level().isClientSide()) { throw new IllegalStateException("SpawnPacketUtil.create called on the logical client!"); } - var buffer = PacketByteBufs.create(); + var buffer = new FriendlyByteBuf(Unpooled.buffer()); buffer.writeVarInt(BuiltInRegistries.ENTITY_TYPE.getId(entity.getType())); buffer.writeUUID(entity.getUUID()); buffer.writeVarInt(entity.getId()); diff --git a/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java index 1a9dc0f9e..8a248c93a 100644 --- a/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java +++ b/fabric/src/main/java/dev/architectury/init/fabric/ArchitecturyClient.java @@ -21,7 +21,7 @@ import dev.architectury.event.events.client.ClientLifecycleEvent; import dev.architectury.event.events.common.LifecycleEvent; -import dev.architectury.networking.fabric.SpawnEntityPacket; +import dev.architectury.networking.SpawnEntityPacket; import net.minecraft.client.Minecraft; public class ArchitecturyClient { diff --git a/fabric/src/main/java/dev/architectury/networking/fabric/NetworkManagerImpl.java b/fabric/src/main/java/dev/architectury/networking/fabric/NetworkManagerImpl.java index f1ece981e..2401a39cb 100644 --- a/fabric/src/main/java/dev/architectury/networking/fabric/NetworkManagerImpl.java +++ b/fabric/src/main/java/dev/architectury/networking/fabric/NetworkManagerImpl.java @@ -22,6 +22,7 @@ import com.mojang.logging.LogUtils; import dev.architectury.networking.NetworkManager; import dev.architectury.networking.NetworkManager.NetworkReceiver; +import dev.architectury.networking.SpawnEntityPacket; import dev.architectury.networking.transformers.PacketSink; import dev.architectury.networking.transformers.PacketTransformer; import dev.architectury.utils.Env; diff --git a/forge/src/main/resources/architectury.mixins.json b/forge/src/main/resources/architectury.mixins.json index 2ebafd4d1..92aaea836 100644 --- a/forge/src/main/resources/architectury.mixins.json +++ b/forge/src/main/resources/architectury.mixins.json @@ -9,7 +9,6 @@ "MixinMinecraft" ], "mixins": [ - "MixinEntitySpawnExtension", "MixinFallingBlockEntity", "MixinItemExtension", "MixinLevelEvent", diff --git a/forge/src/main/java/dev/architectury/mixin/forge/MixinEntitySpawnExtension.java b/minecraftforge/src/main/java/dev/architectury/mixin/forge/minecraftforge/MixinEntitySpawnExtension.java similarity index 96% rename from forge/src/main/java/dev/architectury/mixin/forge/MixinEntitySpawnExtension.java rename to minecraftforge/src/main/java/dev/architectury/mixin/forge/minecraftforge/MixinEntitySpawnExtension.java index da75b60d0..fd04a90d5 100644 --- a/forge/src/main/java/dev/architectury/mixin/forge/MixinEntitySpawnExtension.java +++ b/minecraftforge/src/main/java/dev/architectury/mixin/forge/minecraftforge/MixinEntitySpawnExtension.java @@ -17,7 +17,7 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.mixin.forge; +package dev.architectury.mixin.forge.minecraftforge; import dev.architectury.extensions.network.EntitySpawnExtension; import net.minecraft.network.FriendlyByteBuf; diff --git a/minecraftforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java b/minecraftforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java index 635d6410b..10052b4b1 100644 --- a/minecraftforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java +++ b/minecraftforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java @@ -37,17 +37,18 @@ import net.minecraft.world.entity.player.Player; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.OnlyIn; +import net.minecraftforge.common.ForgeHooks; import net.minecraftforge.event.entity.player.PlayerEvent; import net.minecraftforge.event.network.CustomPayloadEvent; import net.minecraftforge.eventbus.api.SubscribeEvent; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.LogicalSide; import net.minecraftforge.fml.common.Mod; -import net.minecraftforge.network.*; +import net.minecraftforge.network.ChannelBuilder; +import net.minecraftforge.network.EventNetworkChannel; +import net.minecraftforge.network.NetworkDirection; import org.slf4j.Logger; -import java.lang.reflect.Constructor; -import java.lang.reflect.InvocationTargetException; import java.util.*; import java.util.function.Consumer; @@ -179,19 +180,7 @@ public static boolean canPlayerReceive(ServerPlayer player, ResourceLocation id) } public static Packet createAddEntityPacket(Entity entity) { - try { - // I love forge - Constructor constructor = Class.forName("net.minecraftforge.network.packets.SpawnEntity").getDeclaredConstructor(Entity.class); - constructor.setAccessible(true); - Object message = constructor.newInstance(entity); - Packet[] packet = new Packet[1]; - NetworkInitialization.PLAY.send(message, new PacketDistributor.PacketTarget(p -> { - packet[0] = (Packet) p; - }, NetworkDirection.PLAY_TO_CLIENT)); - return Objects.requireNonNull(packet[0], "Expected packet to be sent!"); - } catch (InstantiationException | ClassNotFoundException | NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException(e); - } + return ForgeHooks.getEntitySpawnPacket(entity); } static FriendlyByteBuf sendSyncPacket(Map map) { diff --git a/minecraftforge/src/main/resources/architectury-forge.mixins.json b/minecraftforge/src/main/resources/architectury-forge.mixins.json index a95e797e5..a02097dc2 100644 --- a/minecraftforge/src/main/resources/architectury-forge.mixins.json +++ b/minecraftforge/src/main/resources/architectury-forge.mixins.json @@ -6,7 +6,8 @@ "client": [ ], "mixins": [ - "minecraftforge.MixinChunkSerializer" + "minecraftforge.MixinChunkSerializer", + "minecraftforge.MixinEntitySpawnExtension" ], "injectors": { "defaultRequire": 1 diff --git a/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java index ffcc0c2b8..7d7a766d4 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java @@ -27,7 +27,6 @@ * Wraps a {@link FriendlyByteBuf} because NeoForge doesn't easily let us use the buf directly. */ public record BufCustomPacketPayload(FriendlyByteBuf buf) implements CustomPacketPayload { - @Override public void write(FriendlyByteBuf arg) { arg.writeBytes(buf); diff --git a/neoforge/src/main/java/dev/architectury/networking/forge/ClientNetworkingManager.java b/neoforge/src/main/java/dev/architectury/networking/forge/ClientNetworkingManager.java index c883373d2..e5532f4f1 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/ClientNetworkingManager.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/ClientNetworkingManager.java @@ -28,14 +28,15 @@ import net.neoforged.bus.api.SubscribeEvent; import net.neoforged.neoforge.client.event.ClientPlayerNetworkEvent; import net.neoforged.neoforge.common.NeoForge; +import net.neoforged.neoforge.network.handling.IPlayPayloadHandler; import java.util.Collections; import java.util.Set; @OnlyIn(Dist.CLIENT) public class ClientNetworkingManager { - public static void initClient() { - NetworkManagerImpl.s2c = NetworkManagerImpl.createPacketHandler(NetworkManager.Side.S2C, NetworkManagerImpl.S2C_TRANSFORMERS); + public static IPlayPayloadHandler initClient() { + var handler = NetworkManagerImpl.createPacketHandler(NetworkManager.Side.S2C, NetworkManagerImpl.S2C_TRANSFORMERS); NeoForge.EVENT_BUS.register(ClientNetworkingManager.class); NetworkManagerImpl.registerS2CReceiver(NetworkManagerImpl.SYNC_IDS, Collections.emptyList(), (buffer, context) -> { @@ -49,6 +50,8 @@ public static void initClient() { NetworkManager.sendToServer(NetworkManagerImpl.SYNC_IDS, NetworkManagerImpl.sendSyncPacket(NetworkManagerImpl.C2S)); }); }); + + return handler; } public static Player getClientPlayer() { diff --git a/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java b/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java index ce47400d0..1ffd1bb93 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java @@ -24,8 +24,10 @@ import com.mojang.logging.LogUtils; import dev.architectury.networking.NetworkManager; import dev.architectury.networking.NetworkManager.NetworkReceiver; +import dev.architectury.networking.SpawnEntityPacket; import dev.architectury.networking.transformers.PacketSink; 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.Unpooled; @@ -47,9 +49,9 @@ import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.entity.player.PlayerEvent; import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; -import net.neoforged.neoforge.network.handling.IPayloadContext; import net.neoforged.neoforge.network.handling.IPlayPayloadHandler; import net.neoforged.neoforge.network.registration.IPayloadRegistrar; +import org.jetbrains.annotations.Nullable; import org.slf4j.Logger; import java.util.*; @@ -71,8 +73,7 @@ public static Packet toPacket(NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer()); packetBuffer.writeResourceLocation(id); packetBuffer.writeBytes(buffer); - Packet packet = side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)); - return packet; + return side == NetworkManager.Side.C2S ? new ServerboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)) : new ClientboundCustomPayloadPacket(new BufCustomPacketPayload(packetBuffer)); } public static void collectPackets(PacketSink sink, NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf buf) { @@ -96,9 +97,15 @@ public static void collectPackets(PacketSink sink, NetworkManager.Side side, Res static final Set serverReceivables = Sets.newHashSet(); private static final Multimap clientReceivables = Multimaps.newMultimap(Maps.newHashMap(), Sets::newHashSet); + static { + EventBusesHooksImpl.whenAvailable(ArchitecturyConstants.MOD_ID, bus -> { + bus.addListener(NetworkManagerImpl::registerPackets); + }); + } + static IPlayPayloadHandler createPacketHandler(NetworkManager.Side direction, Map map) { return (arg, context) -> { - + NetworkManager.Side side = side(context.flow()); if (side != direction) return; ResourceLocation type = arg.buf().readResourceLocation(); @@ -114,7 +121,7 @@ public Player getPlayer() { @Override public void queue(Runnable runnable) { - context.workHandler().submitAsync(runnable); // FIXME: is this correct? + context.workHandler().submitAsync(runnable); } @Override @@ -165,10 +172,9 @@ public static boolean canPlayerReceive(ServerPlayer player, ResourceLocation id) } public static Packet createAddEntityPacket(Entity entity) { - return entity.getAddEntityPacket(); + return SpawnEntityPacket.create(entity); } - @SuppressWarnings("SameParameterValue") static FriendlyByteBuf sendSyncPacket(Map map) { List availableIds = Lists.newArrayList(map.keySet()); FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer()); @@ -192,34 +198,26 @@ public static void loggedOut(PlayerEvent.PlayerLoggedOutEvent event) { /** * Needs to be on the mod bus for some reason... */ - @Mod.EventBusSubscriber(modid = ArchitecturyConstants.MOD_ID, bus = Mod.EventBusSubscriber.Bus.MOD) - static class P { - @SubscribeEvent - public static void registerPackets(RegisterPayloadHandlerEvent event) { - //noinspection removal - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::initClient); + public static void registerPackets(RegisterPayloadHandlerEvent event) { + //noinspection removal + @Nullable + IPlayPayloadHandler s2c = DistExecutor.unsafeCallWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::initClient); - IPayloadRegistrar registrar = event.registrar("architectury")/*.versioned(Platform.getMod("architectury-api").getVersion())*/.optional(); - registrar.play(CHANNEL_ID, BufCustomPacketPayload::new, bufCustomPacketPayloadIPayloadHandlerIDirectionAwarePayloadHandlerBuilder -> { - bufCustomPacketPayloadIPayloadHandlerIDirectionAwarePayloadHandlerBuilder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(s2c); - }); - //registrar.play() + IPayloadRegistrar registrar = event.registrar("architectury")/*.versioned(Platform.getMod("architectury-api").getVersion())*/.optional(); + registrar.play(CHANNEL_ID, BufCustomPacketPayload::new, builder -> { + builder.server(createPacketHandler(NetworkManager.Side.C2S, C2S_TRANSFORMERS)).client(s2c); + }); - registerC2SReceiver(SYNC_IDS, Collections.emptyList(), (buffer, context) -> { - Set receivables = (Set) clientReceivables.get(context.getPlayer()); - int size = buffer.readInt(); - receivables.clear(); - for (int i = 0; i < size; i++) { - receivables.add(buffer.readResourceLocation()); - } - }); - } + registerC2SReceiver(SYNC_IDS, Collections.emptyList(), (buffer, context) -> { + Set receivables = (Set) clientReceivables.get(context.getPlayer()); + int size = buffer.readInt(); + receivables.clear(); + for (int i = 0; i < size; i++) { + receivables.add(buffer.readResourceLocation()); + } + }); } - - static IPlayPayloadHandler s2c; - - static NetworkManager.Side side(PacketFlow flow) { return flow.isClientbound() ? NetworkManager.Side.S2C : flow.isServerbound() ? NetworkManager.Side.C2S : null; diff --git a/testmod-common/src/main/java/dev/architectury/test/entity/TestEntity.java b/testmod-common/src/main/java/dev/architectury/test/entity/TestEntity.java index c842d7227..60673d5a1 100644 --- a/testmod-common/src/main/java/dev/architectury/test/entity/TestEntity.java +++ b/testmod-common/src/main/java/dev/architectury/test/entity/TestEntity.java @@ -46,8 +46,6 @@ public TestEntity(EntityType entityType, Level level) { @Override public Packet getAddEntityPacket() { - // Custom packets broken in BundlePacket - if (ArchitecturyTarget.getCurrentTarget().equals("neoforge")) return super.getAddEntityPacket(); return NetworkManager.createAddEntityPacket(this); }