Packet.java 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940
  1. package com.hexdragon.util.network;
  2. import com.hexdragon.enchrebirth.Main;
  3. import net.minecraft.entity.player.ServerPlayerEntity;
  4. import net.minecraft.network.PacketBuffer;
  5. import net.minecraftforge.fml.network.NetworkDirection;
  6. import net.minecraftforge.fml.network.NetworkEvent;
  7. import net.minecraftforge.fml.network.PacketDistributor;
  8. import javax.annotation.Nullable;
  9. import java.util.function.Supplier;
  10. public abstract class Packet {
  11. // 编码方法(解码方法让子类自己写,Java 不允许 Override 一个 Static 方法)
  12. public abstract void encoder(PacketBuffer buf);
  13. // 接收到数据包的事件处理
  14. public void onReceivePacket(Supplier<NetworkEvent.Context> ctx) {
  15. final NetworkEvent.Context context = ctx.get();
  16. if (context.getDirection() == NetworkDirection.PLAY_TO_SERVER) {
  17. context.enqueueWork(() -> onServerReceivePacket(context.getSender()));
  18. } else if (context.getDirection() == NetworkDirection.PLAY_TO_SERVER) {
  19. context.enqueueWork(() -> onClientReceivePacket(context.getSender()));
  20. } else {
  21. Main.LOGGER.warn("出现意料外的数据包传递方向");
  22. }
  23. context.setPacketHandled(true);
  24. }
  25. // 接收到数据包的处理
  26. public void onServerReceivePacket(@Nullable ServerPlayerEntity senderPlayer) {Main.LOGGER.warn("服务端接收到了未经子类处理的数据包,它可能应该发送给客户端");}
  27. public void onClientReceivePacket(@Nullable ServerPlayerEntity senderPlayer) {Main.LOGGER.warn("客户端接收到了未经子类处理的数据包,它可能应该发送给服务端");}
  28. // 将数据包发送至特定对象
  29. // 如果要扩展支持的对象范围,使用不同的 PacketDistributor 即可
  30. public void sendToServer() {PacketManager.channel.sendToServer(this);}
  31. public void sendToPlayer(ServerPlayerEntity player) {PacketManager.channel.send(PacketDistributor.PLAYER.with(() -> player), this); }
  32. }