Skip to content

Commit

Permalink
Change styling, fix entity spawn packets on NeoForge, simplify networ…
Browse files Browse the repository at this point in the history
…king code for NeoForge
  • Loading branch information
shedaniel committed Jan 6, 2024
1 parent 42d05f8 commit 2d81fab
Show file tree
Hide file tree
Showing 12 changed files with 47 additions and 62 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -42,7 +41,7 @@ public static Packet<ClientGamePacketListener> 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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
1 change: 0 additions & 1 deletion forge/src/main/resources/architectury.mixins.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
"MixinMinecraft"
],
"mixins": [
"MixinEntitySpawnExtension",
"MixinFallingBlockEntity",
"MixinItemExtension",
"MixinLevelEvent",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -179,19 +180,7 @@ public static boolean canPlayerReceive(ServerPlayer player, ResourceLocation id)
}

public static Packet<ClientGamePacketListener> 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<ClientGamePacketListener>[] packet = new Packet[1];
NetworkInitialization.PLAY.send(message, new PacketDistributor.PacketTarget(p -> {
packet[0] = (Packet<ClientGamePacketListener>) 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<ResourceLocation, NetworkReceiver> map) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,8 @@
"client": [
],
"mixins": [
"minecraftforge.MixinChunkSerializer"
"minecraftforge.MixinChunkSerializer",
"minecraftforge.MixinEntitySpawnExtension"
],
"injectors": {
"defaultRequire": 1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<BufCustomPacketPayload> 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) -> {
Expand All @@ -49,6 +50,8 @@ public static void initClient() {
NetworkManager.sendToServer(NetworkManagerImpl.SYNC_IDS, NetworkManagerImpl.sendSyncPacket(NetworkManagerImpl.C2S));
});
});

return handler;
}

public static Player getClientPlayer() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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.*;
Expand All @@ -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) {
Expand All @@ -96,9 +97,15 @@ public static void collectPackets(PacketSink sink, NetworkManager.Side side, Res
static final Set<ResourceLocation> serverReceivables = Sets.newHashSet();
private static final Multimap<Player, ResourceLocation> clientReceivables = Multimaps.newMultimap(Maps.newHashMap(), Sets::newHashSet);

static {
EventBusesHooksImpl.whenAvailable(ArchitecturyConstants.MOD_ID, bus -> {
bus.addListener(NetworkManagerImpl::registerPackets);
});
}

static IPlayPayloadHandler<BufCustomPacketPayload> createPacketHandler(NetworkManager.Side direction, Map<ResourceLocation, PacketTransformer> map) {
return (arg, context) -> {

NetworkManager.Side side = side(context.flow());
if (side != direction) return;
ResourceLocation type = arg.buf().readResourceLocation();
Expand All @@ -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
Expand Down Expand Up @@ -165,10 +172,9 @@ public static boolean canPlayerReceive(ServerPlayer player, ResourceLocation id)
}

public static Packet<ClientGamePacketListener> createAddEntityPacket(Entity entity) {
return entity.getAddEntityPacket();
return SpawnEntityPacket.create(entity);
}

@SuppressWarnings("SameParameterValue")
static FriendlyByteBuf sendSyncPacket(Map<ResourceLocation, NetworkReceiver> map) {
List<ResourceLocation> availableIds = Lists.newArrayList(map.keySet());
FriendlyByteBuf packetBuffer = new FriendlyByteBuf(Unpooled.buffer());
Expand All @@ -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<BufCustomPacketPayload> 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<ResourceLocation> receivables = (Set<ResourceLocation>) 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<ResourceLocation> receivables = (Set<ResourceLocation>) clientReceivables.get(context.getPlayer());
int size = buffer.readInt();
receivables.clear();
for (int i = 0; i < size; i++) {
receivables.add(buffer.readResourceLocation());
}
});
}

static IPlayPayloadHandler<BufCustomPacketPayload> s2c;



static NetworkManager.Side side(PacketFlow flow) {
return flow.isClientbound() ? NetworkManager.Side.S2C : flow.isServerbound() ? NetworkManager.Side.C2S : null;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,6 @@ public TestEntity(EntityType<? extends Cow> entityType, Level level) {

@Override
public Packet<ClientGamePacketListener> getAddEntityPacket() {
// Custom packets broken in BundlePacket
if (ArchitecturyTarget.getCurrentTarget().equals("neoforge")) return super.getAddEntityPacket();
return NetworkManager.createAddEntityPacket(this);
}

Expand Down

0 comments on commit 2d81fab

Please sign in to comment.