Вопросы

anti344 написал(а):
Кгм, учитывая, что она говорит про ByteBuf, который является частью Netty, осмелюсь с тобой не согласится и заявить, что ты еще больше её путаешь.

Пишется по-порядку, пишешь в него инт1 и инт2(buf.writeInt(...)) и потом в том-же порядке читать надо(уже на другой стороне, где тебе дасть его должны будут).

var int1, int2

def handleOnServer() = {
  buf.writeInt(int1)
  buf.writeInt(int2)
}

def handleOnClient() = {
  int1 = buf.readInt()
  int2 = buf.readInt()
}
В какой класс кстати писать?
 
Анти спокойно подсунул Скалу в код, а другим и норм, лол.
 
Oldestkon написал(а):
Анти спокойно подсунул Скалу в код, а другим и норм, лол.
Я  поняла,что это скала. Ну куда сувать? Как я поняла это метод с записью в  байтбуфер значения и наоборот
 
Мне тут какой-то нигерский кекс попался, пока я чаи распивал.
А, да, о чём это я.
Вопрос: тебе нужен именно ByteBuf? Если он, то для каких именно целей?
Или тебе надо просто напросто отправить пакет с данными?

Ответ на первый вопрос:

Пихать инфу в него вот так:
Код:
byte[] data = new byte[4];
for (int i = 0; i < 4; i++)
    data[i] = i*4;
ByteBuf buf = ByteBuf.copiedBuffer(data);

Считывать так:
Код:
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);
 
Интересно, а зачем такое извращение, если в буффере уже все есть?
 
Это из доков Netty, лил.
Я только не понимаю зачем тут ByteBuf, Netty вроде сам через него всё проворачивает. А тебе остается лишь сидеть и пихать данные в готовые методы. Вот я тоже подумал и решил кинуть что-то поближе к низкому уровню.
 
Oldestkon написал(а):
Мне тут какой-то нигерский кекс попался, пока я чаи распивал.
А, да, о чём это я.
Вопрос: тебе нужен именно ByteBuf? Если он, то для каких именно целей?
Или тебе надо просто напросто отправить пакет с данными?

Ответ на первый вопрос:

Пихать инфу в него вот так:
Код:
byte[] data = new byte[4];
for (int n = 0; n < 4; n++)
    data[n] = n*4;
ByteBuf buf = ByteBuf.copiedBuffer(data);



Считывать так:

Код:
byte[] bytes = new byte[buf.readableBytes()];
buf.readBytes(bytes);


Пихать то куда?
И метод ещё не находит :/
 
Упс. Там не ByteBuf.copiedBuffer, а Unpooled.copiedBuffer.
Короче, тебе эти ByteBuf действительно нужны или просто данные передать?
 
Oldestkon написал(а):
Упс. Там не ByteBuf.copiedBuffer, а Unpooled.copiedBuffer.
Короче, тебе эти ByteBuf действительно нужны или просто данные передать?
Кинуть данные с серва на клиент
 
Тогда дрэгон тебе всё правильно описал, и ссылку кинул нужную.
http://www.minecraftforge.net/wiki/Packet_Handling

Код:
    public Packet250CustomPayload buildPacket() {
        Random random = new Random();
        int randomInt1 = random.nextInt();
        int randomInt2 = random.nextInt();

        ByteArrayOutputStream bos = new ByteArrayOutputStream(8);    // пишем 2 int, размер int = 4, 2*4 = 8
        DataOutputStream outputStream = new DataOutputStream(bos);
        try {
                outputStream.writeInt(randomInt1);
                outputStream.writeInt(randomInt2);
        } catch (Exception ex) {
                ex.printStackTrace();
        }

        Packet250CustomPayload packet = new Packet250CustomPayload();
        packet.channel = "OurModID";
        packet.data = bos.toByteArray();
        packet.length = bos.size();
        return packet;
    }
Так пакет создается.
Отправление:

Код:
PacketDispatcher.sendPacketToPlayer(buildPacket(), (Player)player)

Далее для каждой стороны создаются хандлеры пакета (если пакет отправляется туда\обратно, если только с сервера - делаем хандлер @SideOnly на Client, или как там это делается, я с форджем не работал).
Код:
public class PacketHandler implements IPacketHandler {

    @Override
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player playerEntity) {
        if (!packet.channel.equals("OurModID")) //если пакет не наш - нафиг его
            return; 

        DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
       
        int randomInt1;
        int randomInt2;
       
        try {
                randomInt1 = inputStream.readInt();
                randomInt2 = inputStream.readInt();
        } catch (IOException e) {
                e.printStackTrace();
                return;
        }
       
        System.out.println(randomInt1 + " " + randomInt2);
    }
}

Короче, там в конце статьи есть полный код.
 
Oldestkon написал(а):
Тогда дрэгон тебе всё правильно описал, и ссылку кинул нужную.
http://www.minecraftforge.net/wiki/Packet_Handling

Код:
    public Packet250CustomPayload buildPacket() {
        Random random = new Random();
        int randomInt1 = random.nextInt();
        int randomInt2 = random.nextInt();

        ByteArrayOutputStream bos = new ByteArrayOutputStream(8);    // пишем 2 int, размер int = 4, 2*4 = 8
        DataOutputStream outputStream = new DataOutputStream(bos);
        try {
                outputStream.writeInt(randomInt1);
                outputStream.writeInt(randomInt2);
        } catch (Exception ex) {
                ex.printStackTrace();
        }

        Packet250CustomPayload packet = new Packet250CustomPayload();
        packet.channel = "OurModID";
        packet.data = bos.toByteArray();
        packet.length = bos.size();
        return packet;
    }
Так пакет создается.
Отправление:

Код:
PacketDispatcher.sendPacketToPlayer(buildPacket(), (Player)player)

Далее для каждой стороны создаются хандлеры пакета (если пакет отправляется туда\обратно, если только с сервера - делаем хандлер @SideOnly на Client, или как там это делается, я с форджем не работал).
Код:
public class PacketHandler implements IPacketHandler {

    @Override
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player playerEntity) {
        if (!packet.channel.equals("OurModID")) //если пакет не наш - нафиг его
            return; 

        DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
       
        int randomInt1;
        int randomInt2;
       
        try {
                randomInt1 = inputStream.readInt();
                randomInt2 = inputStream.readInt();
        } catch (IOException e) {
                e.printStackTrace();
                return;
        }
       
        System.out.println(randomInt1 + " " + randomInt2);
    }
}

Короче, там в конце статьи есть полный код.
Куда отправку сувать.
(Я скоро уже заплачу :'( )
 
Опять вы ей суете древний код, блин. Жди Анти, он знает.
 
1. ДА НУ НА 1.7.2 УЖЕ NETTY, И ВСЁ ПОМЕНЯЛОСЬ.
2. ByteBuf тебе создавать не нужно, тебе его должны дать в обоих случаях.
2.5. Если сильно хочешь, то проще всего - Unpooled.buffer()
3. Scala я там использовал просто для примера(лень, ибо так короче просто).
 
Объяснил бы лучше, всяко полезнее капсопредложений будет.

Так бы и сказали, что другое надо. Я на фордж вообще не пишу и про версию не видел.
http://www.minecraftforge.net/wiki/Netty_Packet_Handling
http://www.minecraftforge.net/forum/index.php?topic=15403.0
Покопался, нашел.

Пример пакета:

Код:
import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import net.minecraft.entity.player.EntityPlayer;

public class PacketSync extends AbstractPacket
{
   boolean toggle;
   boolean digUnderToggle;

   public PacketSync() {
   }

   public PacketSync(boolean ver1, boolean ver2) {
      toggle = ver1;
      digUnderToggle = ver2;
   }

   @Override
   public void encodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
      buffer.writeBoolean(toggle);
      buffer.writeBoolean(digUnderToggle);
   }

   @Override
   public void decodeInto(ChannelHandlerContext ctx, ByteBuf buffer) {
      toggle = buffer.readBoolean();
      digUnderToggle = buffer.readBoolean();

   }

   @Override
   public void handleClientSide(EntityPlayer player) {
   }

   @Override
   public void handleServerSide(EntityPlayer player) {
      System.out.println(toggle);
      System.out.println(digUnderToggle);
   }
}


Регистрация:

Объявляешь где-нибудь в классе мода:

Код:
public static final PacketPipeline packetPipeline = new PacketPipeline();

Код:
@EventHandler
public void initialise(FMLInitializationEvent evt) {
    packetPipeline.initialise();
    packetPipeline.registerPacket(PacketSync.class);
}
Код:
@EventHandler
public void postInitialise(FMLPostInitializationEvent evt) {
    packetPipeline.postInitialise();
}

Отправка:
Код:
packetPipeline.sendToServer(new PacketSync(true, false));

Отправлять можно откуда угодно, опять же:

Код:
ModClass.packetPipeline.sendTo***(Player/Server)(new MyPacket(args));

Пример из КИТАЙСКОГО ГРЕБАНОГО САЙТА.
Тебе осталось только вытаскивать игрока на сервере и найти метод в packetPipeline, который отсылает пакет с сервера игроку. Ну ещё определять сторону через
Код:
FMLCommonHandler.instance().getEffectiveSide();

P.S. Ни сурсов, ни форджа, ничего, где можно протестить, под рукой нет. Правил все на коленках, могут быть где-то незначительные косяки.
 
Ну я-то думаю, что она следует стриму.
А вообще, откуда ты взял AbstractPacket?
 
Назад
Сверху