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 77fb93d57..7eeee2bac 100644 --- a/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java +++ b/common/src/main/java/dev/architectury/hooks/level/ExplosionHooks.java @@ -19,16 +19,23 @@ 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 { private ExplosionHooks() { } - @ExpectPlatform + /** + * @deprecated no longer needed. + * @see Explosion#center() + */ + @Deprecated(forRemoval = true) public static Vec3 getPosition(Explosion explosion) { - throw new AssertionError(); + return explosion.center(); } } 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/mixin/fabric/MixinExplosion.java b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinExplosion.java index 22b33c787..4988b0d8f 100644 --- a/fabric/src/main/java/dev/architectury/mixin/fabric/MixinExplosion.java +++ b/fabric/src/main/java/dev/architectury/mixin/fabric/MixinExplosion.java @@ -20,14 +20,13 @@ package dev.architectury.mixin.fabric; import dev.architectury.event.events.common.ExplosionEvent; -import dev.architectury.hooks.level.fabric.ExplosionHooksImpl; import net.minecraft.core.BlockPos; import net.minecraft.world.entity.Entity; import net.minecraft.world.level.Explosion; import net.minecraft.world.level.Level; -import net.minecraft.world.phys.Vec3; -import org.jetbrains.annotations.Nullable; -import org.spongepowered.asm.mixin.*; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; @@ -37,33 +36,15 @@ import java.util.Set; @Mixin(Explosion.class) -public class MixinExplosion implements ExplosionHooksImpl.ExplosionExtensions { +public class MixinExplosion { @Shadow @Final private Level level; - @Shadow - @Final - private double x; - @Shadow - @Final - private double y; - @Shadow - @Final - private double z; - @Unique - Vec3 position; + @SuppressWarnings("InvalidInjectorMethodSignature") @Inject(method = "explode", at = @At(value = "INVOKE", target = "Lnet/minecraft/world/phys/Vec3;(DDD)V", ordinal = 1), locals = LocalCapture.CAPTURE_FAILHARD) private void explodePost(CallbackInfo ci, Set set, int i, float q, int r, int s, int t, int u, int v, int w, List list) { ExplosionEvent.DETONATE.invoker().explode(level, (Explosion) (Object) this, list); } - - @Override - public Vec3 architectury_getPosition() { - if (position == null) { - return position = new Vec3(x, y, z); - } - return position; - } } 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/java/dev/architectury/hooks/level/forge/ExplosionHooksImpl.java b/forge/src/main/java/dev/architectury/hooks/level/forge/ExplosionHooksImpl.java deleted file mode 100644 index 60041716c..000000000 --- a/forge/src/main/java/dev/architectury/hooks/level/forge/ExplosionHooksImpl.java +++ /dev/null @@ -1,29 +0,0 @@ -/* - * This file is part of architectury. - * Copyright (C) 2020, 2021, 2022 architectury - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; either - * version 3 of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with this program; if not, write to the Free Software Foundation, - * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. - */ - -package dev.architectury.hooks.level.forge; - -import net.minecraft.world.level.Explosion; -import net.minecraft.world.phys.Vec3; - -public class ExplosionHooksImpl { - public static Vec3 getPosition(Explosion explosion) { - return explosion.getPosition(); - } -} 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/gradle.properties b/gradle.properties index bea439f74..2e7701919 100644 --- a/gradle.properties +++ b/gradle.properties @@ -13,12 +13,12 @@ archives_base_name_snapshot=architectury-snapshot base_version=11.0 maven_group=dev.architectury -fabric_loader_version=0.15.1 -fabric_api_version=0.91.1+1.20.4 -mod_menu_version=7.0.0 +fabric_loader_version=0.15.3 +fabric_api_version=0.92.0+1.20.4 +mod_menu_version=9.0.0 -forge_version=49.0.3 -neoforge_version=20.4.46-beta +forge_version=49.0.14 +neoforge_version=20.4.77-beta curseforge_id=419699 modrinth_id=lhGA9TYQ 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/fabric/src/main/java/dev/architectury/hooks/level/fabric/ExplosionHooksImpl.java b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java similarity index 57% rename from fabric/src/main/java/dev/architectury/hooks/level/fabric/ExplosionHooksImpl.java rename to neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java index 96525346b..7d7a766d4 100644 --- a/fabric/src/main/java/dev/architectury/hooks/level/fabric/ExplosionHooksImpl.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/BufCustomPacketPayload.java @@ -17,17 +17,24 @@ * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -package dev.architectury.hooks.level.fabric; +package dev.architectury.networking.forge; -import net.minecraft.world.level.Explosion; -import net.minecraft.world.phys.Vec3; +import net.minecraft.network.FriendlyByteBuf; +import net.minecraft.network.protocol.common.custom.CustomPacketPayload; +import net.minecraft.resources.ResourceLocation; -public class ExplosionHooksImpl { - public static Vec3 getPosition(Explosion explosion) { - return ((ExplosionExtensions) explosion).architectury_getPosition(); +/** + * 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); } - public interface ExplosionExtensions { - Vec3 architectury_getPosition(); + @SuppressWarnings("NullableProblems") + @Override + public ResourceLocation id() { + return NetworkManagerImpl.CHANNEL_ID; } } 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 0c15977bd..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,15 +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.PlayNetworkDirection; +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.CHANNEL.addListener(NetworkManagerImpl.createPacketHandler(PlayNetworkDirection.PLAY_TO_CLIENT, 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) -> { @@ -50,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 05241d3f8..8700c0991 100644 --- a/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java +++ b/neoforge/src/main/java/dev/architectury/networking/forge/NetworkManagerImpl.java @@ -24,13 +24,18 @@ 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; import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; +import net.minecraft.network.protocol.PacketFlow; +import net.minecraft.network.protocol.common.ClientboundCustomPayloadPacket; +import net.minecraft.network.protocol.common.ServerboundCustomPayloadPacket; import net.minecraft.network.protocol.game.ClientGamePacketListener; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.level.ServerPlayer; @@ -43,12 +48,13 @@ import net.neoforged.fml.LogicalSide; import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.event.entity.player.PlayerEvent; -import net.neoforged.neoforge.network.*; -import net.neoforged.neoforge.network.event.EventNetworkChannel; +import net.neoforged.neoforge.network.event.RegisterPayloadHandlerEvent; +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.*; -import java.util.function.Consumer; @Mod.EventBusSubscriber(modid = ArchitecturyConstants.MOD_ID) public class NetworkManagerImpl { @@ -67,7 +73,7 @@ public static Packet toPacket(NetworkManager.Side side, ResourceLocation id, FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer()); packetBuffer.writeResourceLocation(id); packetBuffer.writeBytes(buffer); - return (side == NetworkManager.Side.C2S ? PlayNetworkDirection.PLAY_TO_SERVER : PlayNetworkDirection.PLAY_TO_CLIENT).buildPacket(new INetworkDirection.PacketData(packetBuffer, 0), CHANNEL_ID); + 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) { @@ -82,9 +88,8 @@ public static void collectPackets(PacketSink sink, NetworkManager.Side side, Res } private static final Logger LOGGER = LogUtils.getLogger(); - private static final ResourceLocation CHANNEL_ID = new ResourceLocation("architectury:network"); + static final ResourceLocation CHANNEL_ID = new ResourceLocation("architectury:network"); static final ResourceLocation SYNC_IDS = new ResourceLocation("architectury:sync_ids"); - static final EventNetworkChannel CHANNEL = NetworkRegistry.ChannelBuilder.named(CHANNEL_ID).networkProtocolVersion(() -> "").clientAcceptedVersions(version -> true).serverAcceptedVersions(version -> true).eventNetworkChannel(); static final Map S2C = Maps.newHashMap(); static final Map C2S = Maps.newHashMap(); static final Map S2C_TRANSFORMERS = Maps.newHashMap(); @@ -93,53 +98,42 @@ public static void collectPackets(PacketSink sink, NetworkManager.Side side, Res private static final Multimap clientReceivables = Multimaps.newMultimap(Maps.newHashMap(), Sets::newHashSet); static { - CHANNEL.addListener(createPacketHandler(PlayNetworkDirection.PLAY_TO_SERVER, C2S_TRANSFORMERS)); - - DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> ClientNetworkingManager::initClient); - - 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()); - } + EventBusesHooksImpl.whenAvailable(ArchitecturyConstants.MOD_ID, bus -> { + bus.addListener(NetworkManagerImpl::registerPackets); }); } - static Consumer createPacketHandler(INetworkDirection direction, Map map) { - return event -> { - NetworkEvent.Context context = event.getSource(); - if (context.getDirection() != direction) return; - if (context.getPacketHandled()) return; - FriendlyByteBuf buffer = event.getPayload(); - if (buffer == null) return; - ResourceLocation type = buffer.readResourceLocation(); + 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(); PacketTransformer transformer = map.get(type); if (transformer != null) { - NetworkManager.Side side = context.getDirection().getReceptionSide() == LogicalSide.CLIENT ? NetworkManager.Side.S2C : NetworkManager.Side.C2S; NetworkManager.PacketContext packetContext = new NetworkManager.PacketContext() { @Override public Player getPlayer() { - return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.getSender(); + return getEnvironment() == Env.CLIENT ? getClientPlayer() : context.player().orElse(null); } @Override public void queue(Runnable runnable) { - context.enqueueWork(runnable); + context.workHandler().submitAsync(runnable); } @Override public Env getEnvironment() { - return context.getDirection().getReceptionSide() == LogicalSide.CLIENT ? Env.CLIENT : Env.SERVER; + 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, buffer, packetContext, (side1, id1, buf1) -> { + + 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); @@ -149,8 +143,6 @@ private Player getClientPlayer() { } else { LOGGER.error("Unknown message ID: " + type); } - - context.setPacketHandled(true); }; } @@ -178,7 +170,7 @@ public static boolean canPlayerReceive(ServerPlayer player, ResourceLocation id) } public static Packet createAddEntityPacket(Entity entity) { - return NetworkHooks.getEntitySpawningPacket(entity); + return SpawnEntityPacket.create(entity); } static FriendlyByteBuf sendSyncPacket(Map map) { @@ -200,4 +192,32 @@ public static void loggedIn(PlayerEvent.PlayerLoggedInEvent event) { public static void loggedOut(PlayerEvent.PlayerLoggedOutEvent event) { clientReceivables.removeAll(event.getEntity()); } + + /** + * Needs to be on the mod bus for some reason... + */ + 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, 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()); + } + }); + } + + static NetworkManager.Side side(PacketFlow flow) { + return flow.isClientbound() ? NetworkManager.Side.S2C : flow.isServerbound() ? NetworkManager.Side.C2S : null; + } } diff --git a/neoforge/src/main/java/dev/architectury/registry/menu/forge/MenuRegistryImpl.java b/neoforge/src/main/java/dev/architectury/registry/menu/forge/MenuRegistryImpl.java index c1c380ebf..abc395d2d 100644 --- a/neoforge/src/main/java/dev/architectury/registry/menu/forge/MenuRegistryImpl.java +++ b/neoforge/src/main/java/dev/architectury/registry/menu/forge/MenuRegistryImpl.java @@ -33,13 +33,13 @@ import net.neoforged.api.distmarker.Dist; import net.neoforged.api.distmarker.OnlyIn; import net.neoforged.neoforge.common.extensions.IMenuTypeExtension; -import net.neoforged.neoforge.network.NetworkHooks; public class MenuRegistryImpl { public static void openExtendedMenu(ServerPlayer player, ExtendedMenuProvider provider) { - NetworkHooks.openScreen(player, provider, provider::saveExtraData); + player.openMenu(provider, provider::saveExtraData); } + @SuppressWarnings("removal") public static MenuType of(SimpleMenuTypeFactory factory) { return new MenuType<>(factory::create, FeatureFlags.VANILLA_SET); } diff --git a/neoforge/src/main/resources/META-INF/mods.toml b/neoforge/src/main/resources/META-INF/mods.toml index 56393a324..b4b44a1a1 100644 --- a/neoforge/src/main/resources/META-INF/mods.toml +++ b/neoforge/src/main/resources/META-INF/mods.toml @@ -17,14 +17,14 @@ license = "LGPL-3" [[dependencies.architectury]] modId = "minecraft" type = "required" -versionRange = "[1.20.3,)" +versionRange = "[1.20.4,)" ordering = "NONE" side = "BOTH" [[dependencies.architectury]] modId = "neoforge" type = "required" -versionRange = "[20.4.40-beta,)" +versionRange = "[20.4.77-beta,)" ordering = "NONE" side = "BOTH" 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 9232bef2e..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 @@ -20,9 +20,15 @@ package dev.architectury.test.entity; import com.google.common.base.Suppliers; +import dev.architectury.injectables.targets.ArchitecturyTarget; import dev.architectury.networking.NetworkManager; +import io.netty.buffer.Unpooled; +import net.minecraft.nbt.CompoundTag; +import net.minecraft.network.FriendlyByteBuf; import net.minecraft.network.protocol.Packet; import net.minecraft.network.protocol.game.ClientGamePacketListener; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerPlayer; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.entity.animal.Cow; @@ -40,7 +46,20 @@ public TestEntity(EntityType entityType, Level level) { @Override public Packet getAddEntityPacket() { - // Custom packets broken in BundlePacket return NetworkManager.createAddEntityPacket(this); } + + @Override + protected void tickDeath() { + super.tickDeath(); + if (!this.level().isClientSide()) { + if (this.getLastAttacker() instanceof ServerPlayer player) { + CompoundTag compoundTag = new CompoundTag(); + compoundTag.putString("DeathCauser", player.getStringUUID()); + FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + buf.writeNbt(compoundTag); + NetworkManager.sendToPlayer(player, new ResourceLocation("architectury_test", "sync_data"), buf); + } + } + } }