- Версия(и) Minecraft
- 1.10.2
Итак, я тут ковырялся в одном своём старом моде (у которого внезапно 144к загрузок и потому я решил попробовать его обновить до актуальных версий) и нашёл там алмазик от самого себя из прошлого.
Я без понятия насколько актуально оно для всяких там последних версий, но вроде класс FMLEventChannel не должны были просто взять и убрать, так что всё должно работать.
Невероятно простой, без усложнений и лишних классов, способ работы с сетью.
Сказочно удобно если у вас всего три пакета и вы не хотите пилить невероятный менеджер с кучей кода, классов и абстракций.
Как вы уже поняли, используется забавный класс форджа - FMLEventChannel, который делает всю работу за нас.
В принципе всё настолько просто, что вам подскажет просто следующий пример и подсказки в IDE, потому это всё я и пишу в сливы:
Я без понятия насколько актуально оно для всяких там последних версий, но вроде класс FMLEventChannel не должны были просто взять и убрать, так что всё должно работать.
Невероятно простой, без усложнений и лишних классов, способ работы с сетью.
Сказочно удобно если у вас всего три пакета и вы не хотите пилить невероятный менеджер с кучей кода, классов и абстракций.
Как вы уже поняли, используется забавный класс форджа - FMLEventChannel, который делает всю работу за нас.
В принципе всё настолько просто, что вам подскажет просто следующий пример и подсказки в IDE, потому это всё я и пишу в сливы:
Network.init()
я вызывал в preinit-е мода, всё работало)
Код:
public final class Network {
private static FMLEventChannel chan;
private Network() {}
public static void init() {
chan = NetworkRegistry.INSTANCE.newEventDrivenChannel(MODID);
chan.register(new Network());
}
@SubscribeEvent
@SideOnly(Side.CLIENT)
public void onClientReceive(ClientCustomPacketEvent e) {
PacketBuffer payload = new PacketBuffer(e.getPacket().payload());
switch(payload.readByte()) {
case 0:
System.out.println("received first packet type on client");
System.out.println("entity id = " + payload.readInt());
System.out.println("f = " + payload.readFloat());
System.out.println("b = " + payload.readBoolean());
break;
case 1:
// this is on client side, remember
System.out.println(Minecraft.getMinecraft().thePlayer);
System.out.println("got a personal message from the server: " + payload.readStringFromBuffer(Integer.MAX_VALUE));
break;
}
}
@SubscribeEvent
@SideOnly(Side.SERVER)
public void onServerReceive(ServerCustomPacketEvent e) {
PacketBuffer payload = new PacketBuffer(e.getPacket().payload());
switch(payload.readByte()) {
// just the same as above ^, and server-side-only stuff is available too
}
}
private static FMLProxyPacket packet(int id, Consumer<PacketBuffer> data) {
PacketBuffer payload = new PacketBuffer(Unpooled.buffer());
payload.writeByte(id);
data.accept(payload);
return new FMLProxyPacket(payload, MODID);
}
public static void sendSomePacketToClients(Entity entity, float f, boolean b) {
chan.sendToDimension(packet(0, p -> {
p.writeInt(entity.getEntityId());
p.writeFloat(f);
p.writeBoolean(b);
}), entity.dimension);
}
public static void sendOtherPacketToClient(EntityPlayerMP client, String data) {
chan.sendTo(packet(1, p -> {
p.writeString(data);
}), client);
}
}