Помогите с пакетами

Версия Minecraft
1.6.4

Fil

14
1
Некорректные теги!
Здравствуйте. А как делать пакетную систему на 1.6.4 ? Желательно с примерами кода, если не сложно.
 
243
28
202
Не сложно. :)

Не помню где можно найти туториал по пакетам на эту версию, поэтому напишу кратко сам. Вот как я это делал давным давно в далёкой далёкой галактике...

Создай класс для работы с пакетами и реализуй IPacketHandler :
Java:
public class PacketHandler implements IPacketHandler { 
  
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player fakePlayer) {     
      
        ByteArrayDataInput reader = ByteStreams.newDataInput((byte[]) packet.data);
      
        EntityPlayer player = (EntityPlayer) fakePlayer;
    }
}


В главном классе под аннотацию Mod добавь аннотацию NetworkMod. Тут указывается необходимость использования пакетов для сервера и клиента, регистрируются каналы, и регистрируется твоя реализация IPacketHandler:
Java:
@NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = {}, packetHandler = PacketHandler.class)


Всё, теперь отправка и обработка. Покажу на примере пакетов для открытия ГПИ инвентарей. Так как это происходит на сервере, то необходимо послать пакет на сервер.

Сначала зарегистрируй канал в NetworkMod:channels = {"opengui"}.

Для удобства метод для отправки идентификаторов ГПИ, размещённый в KeyHandler. Для отправки используй нужный канал.
Java:
    public void openGUI(int guiId) {
       
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        DataOutputStream outputStream = new DataOutputStream(byteStream);
       
        try {
           
            outputStream.writeByte(guiId);//Запись id
            PacketDispatcher.sendPacketToServer(PacketDispatcher.getPacket("opengui", (byte[]) byteStream.toByteArray()));//Отправка на сервер
        }
       
        catch (IOException e) {}
    }


Обработка в PacketHandler:
Java:
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player fakePlayer) {      
       
        ByteArrayDataInput reader = ByteStreams.newDataInput((byte[]) packet.data);
        byte packetId = reader.readByte();  
       
        EntityPlayer player = (EntityPlayer) fakePlayer;
       
        if (packet.channel.equals("opengui")) {//Канал для открытия ГПИ
       
            int guiId = reader.readByte();//Считывание полученного id.

            player.openGui(ModMain.instance, guiId, player.worldObj, (int) player.posX, (int) player.posY, (int) player.posZ);//Открытие ГПИ
        }
    }
}


Что бы что то послать на клиент, нужно использовать PacketDispatcher#sendPacketToPlayer при отправке (с сервера, естественно). В остальном всё так же, как и с серверным пакетом.

Собственно всё. Как синхронизировать ItemStack думаю сам догадаешься, если будет нужно. И рекомендую всё таки перейти на версию поновее.
 

Fil

14
1
Не сложно. :)

Не помню где можно найти туториал по пакетам на эту версию, поэтому напишу кратко сам. Вот как я это делал давным давно в далёкой далёкой галактике...

Создай класс для работы с пакетами и реализуй IPacketHandler :
Java:
public class PacketHandler implements IPacketHandler {
 
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player fakePlayer) {    
     
        ByteArrayDataInput reader = ByteStreams.newDataInput((byte[]) packet.data);
     
        EntityPlayer player = (EntityPlayer) fakePlayer;
    }
}


В главном классе под аннотацию Mod добавь аннотацию NetworkMod. Тут указывается необходимость использования пакетов для сервера и клиента, регистрируются каналы, и регистрируется твоя реализация IPacketHandler:
Java:
@NetworkMod(clientSideRequired = true, serverSideRequired = true, channels = {}, packetHandler = PacketHandler.class)


Всё, теперь отправка и обработка. Покажу на примере пакетов для открытия ГПИ инвентарей. Так как это происходит на сервере, то необходимо послать пакет на сервер.

Сначала зарегистрируй канал в NetworkMod:channels = {"opengui"}.

Для удобства метод для отправки идентификаторов ГПИ, размещённый в KeyHandler. Для отправки используй нужный канал.
Java:
    public void openGUI(int guiId) {
      
        ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
        DataOutputStream outputStream = new DataOutputStream(byteStream);
      
        try {
          
            outputStream.writeByte(guiId);//Запись id
            PacketDispatcher.sendPacketToServer(PacketDispatcher.getPacket("opengui", (byte[]) byteStream.toByteArray()));//Отправка на сервер
        }
      
        catch (IOException e) {}
    }


Обработка в PacketHandler:
Java:
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player fakePlayer) {     
      
        ByteArrayDataInput reader = ByteStreams.newDataInput((byte[]) packet.data);
        byte packetId = reader.readByte(); 
      
        EntityPlayer player = (EntityPlayer) fakePlayer;
      
        if (packet.channel.equals("opengui")) {//Канал для открытия ГПИ
      
            int guiId = reader.readByte();//Считывание полученного id.

            player.openGui(ModMain.instance, guiId, player.worldObj, (int) player.posX, (int) player.posY, (int) player.posZ);//Открытие ГПИ
        }
    }
}


Что бы что то послать на клиент, нужно использовать PacketDispatcher#sendPacketToPlayer при отправке (с сервера, естественно). В остальном всё так же, как и с серверным пакетом.

Собственно всё. Как синхронизировать ItemStack думаю сам догадаешься, если будет нужно. И рекомендую всё таки перейти на версию поновее.








А можешь помочь помочь с крашем? Вот краш репорт.
 

Вложения

  • crash-2018-02-11_20_24_08-server (1).txt
    5 KB · Просмотры: 8

Fil

14
1
Код надо оформлять правильно!
AustereTony, вот.


Java:
package com.programmers.chlen.main;

import com.google.common.io.ByteArrayDataInput;
import com.google.common.io.ByteStreams;
import com.programmers.chlen.weapons.EntityBullet;

import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.Player;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet250CustomPayload;

public class PacketHandler implements IPacketHandler {
    
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player fakePlayer) {    
         
        ByteArrayDataInput reader = ByteStreams.newDataInput((byte[]) packet.data);
        byte damage = reader.readByte();
     
        EntityPlayer player = (EntityPlayer) fakePlayer;
     
        if (packet.channel.equals("chlen")) {//Канал для открытия ГПИ
     
            int damageBullet = reader.readByte();
            //player.addChatMessage(""+damageBullet);
        }
        }
    }
 
Последнее редактирование модератором:
Сверху