svk так и не выложил систему пакетов Agravaine

7,166
329
1,544
сабж.
 
Ничего сложно в пакетах нет, дефольтная имплементация пакетов в фордже работает.
 
у него то она уже готовая
 
У форджа-то она тоже уже готовая для использования другими модами.
 
Код:
import io.netty.buffer.ByteBuf;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.world.World;

public interface IPacketHandler {

    public void handleClientSide(ByteBuf buf, World world, EntityClientPlayerMP player);

    public void handleServerSide(ByteBuf buf, World world, EntityPlayerMP player);
}

Код:
import cpw.mods.fml.common.eventhandler.SubscribeEvent;
import cpw.mods.fml.common.network.ByteBufUtils;
import cpw.mods.fml.common.network.FMLEventChannel;
import cpw.mods.fml.common.network.FMLNetworkEvent.ClientCustomPacketEvent;
import cpw.mods.fml.common.network.FMLNetworkEvent.ServerCustomPacketEvent;
import cpw.mods.fml.common.network.NetworkRegistry;
import cpw.mods.fml.common.network.NetworkRegistry.TargetPoint;
import cpw.mods.fml.common.network.internal.FMLProxyPacket;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import net.minecraft.client.Minecraft;
import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.entity.player.EntityPlayerMP;
import net.minecraft.item.ItemStack;
import net.minecraft.nbt.NBTTagCompound;
import net.minecraft.network.NetHandlerPlayServer;

public class NetworkManager {

    private final FMLEventChannel channel;
    private final String channelName;
    private final IPacketHandler packetHandler;

    public NetworkManager(String name, IPacketHandler pktHandler) {
        channelName = name;
        channel = NetworkRegistry.INSTANCE.newEventDrivenChannel(channelName);
        channel.register(this);
        packetHandler = pktHandler;
    }

    public static NetworkManager registerPacketHandler(String name, IPacketHandler packetHandler) {
        return new NetworkManager(name, packetHandler);
    }

    @SubscribeEvent
    public void onServerPacket(ServerCustomPacketEvent e) {
        EntityPlayerMP player = ((NetHandlerPlayServer) e.handler).playerEntity;
        ByteBuf buf = e.packet.payload();
        packetHandler.handleServerSide(buf, player.worldObj, player);
    }

    @SubscribeEvent
    public void onClientPacket(ClientCustomPacketEvent event) {
        EntityClientPlayerMP player = Minecraft.getMinecraft().thePlayer;
        ByteBuf buf = event.packet.payload();
        packetHandler.handleClientSide(buf, player.worldObj, player);
    }

    public void sendToServer(FMLProxyPacket packet) {
        channel.sendToServer(packet);
    }

    public void sendToClients(FMLProxyPacket packet) {
        channel.sendToAll(packet);
    }

    public void sendToPlayer(FMLProxyPacket packet, EntityPlayerMP player) {
        channel.sendTo(packet, player);
    }

    public void sendToArea(FMLProxyPacket packet, double x, double y, double z, double range, int dim) {
        channel.sendToAllAround(packet, new TargetPoint(dim, x, y, z, range));
    }

    public void sendToDimension(FMLProxyPacket packet, int id) {
        channel.sendToDimension(packet, id);
    }

    public FMLProxyPacket createPacket(Object... data) {
        return createPacket(Unpooled.buffer(32), data);
    }

    public FMLProxyPacket createPacket(ByteBuf buf, Object... data) {
        for (Object obj : data) {
            if (obj instanceof Byte) {
                buf.writeByte((Byte) obj);
            }
            if (obj instanceof Short) {
                buf.writeShort((Short) obj);
            }
            if (obj instanceof Integer) {
                buf.writeInt((Integer) obj);
            }
            if (obj instanceof Float) {
                buf.writeFloat((Float) obj);
            }
            if (obj instanceof Double) {
                buf.writeDouble((Double) obj);
            }
            if (obj instanceof Long) {
                buf.writeLong((Long) obj);
            }
            if (obj instanceof Character) {
                buf.writeChar((Character) obj);
            }
            if (obj instanceof String) {
                ByteBufUtils.writeUTF8String(buf, (String) obj);
            }
            if (obj instanceof ItemStack) {
                ByteBufUtils.writeItemStack(buf, (ItemStack) obj);
            }
            if (obj instanceof NBTTagCompound) {
                ByteBufUtils.writeTag(buf, (NBTTagCompound) obj);
            }
        }
        return new FMLProxyPacket(buf, channelName);
    }
}


Инициализировать как-то так
Код:
NetworkManager nw=NetworkManager.registerPacketHandler("NAME",new Object implements IPacketHandler);
 
ой, спасибо, очень вкусно)
 
Кстати, всё хотел спросить, откуда он берёт EntityClientPlayerMP и EntityPlayerMP?
Он-же характеризует отдельного игрока, или всех?
 
Наверно, того, который является "клиентским" для конкретного клиента)
 
Когда отсылаешь с сервера клиенту, то ты пишешь игрока при отправке.

С клиента серверу, игрок автоматом определяется?
С сервера клиенту, надо самому писать?

Код:
CommonProxy.packetSender.sendToClients(CommonProxy.packetSender.createPacket((byte)1));

CommonProxy.packetSender.sendToServer(CommonProxy.packetSender.createPacket((byte)0));

Где игрока указывать? :\
Или он везде автоматом?
 
А если мне надо одному конкретному отправить?
 
а, блин, точно)
 
Назад
Сверху