Дублировани пакета

675
2
Доброго времени суток.

Не пойму, почему вместо одного пакета приходит два.

Код:
Код:
package flymod.core;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.util.Random;

import net.minecraft.client.entity.EntityClientPlayerMP;
import net.minecraft.entity.player.EntityPlayer;
import net.minecraft.network.INetworkManager;
import net.minecraft.network.packet.Packet250CustomPayload;
import cpw.mods.fml.common.FMLCommonHandler;
import cpw.mods.fml.common.network.IPacketHandler;
import cpw.mods.fml.common.network.PacketDispatcher;
import cpw.mods.fml.common.network.Player;
import cpw.mods.fml.relauncher.Side;
import flymod.ModInfo;
import flymod.core.contentmanager.Speaker;

public class PacketHandler implements IPacketHandler {
    
    private Side side = FMLCommonHandler.instance().getEffectiveSide();

    @Override
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) {
            if (packet.channel.equals(ModInfo.CHANNEL)) {
                DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
                
                if(side == Side.SERVER) packetReaderFromClient(inputStream, player);
                
                if(side == Side.CLIENT) packetReaderFromServer(inputStream, player);
                
            }
    }
    
    private void packetReaderFromClient(DataInputStream inputStream, Player player) {
            try {
                switch(inputStream.readInt()) {
                /*
                case 0: {
                    System.out.println("[" + side + "] YEY! (Сообщение пришло на сервер)"); break;
                }
                */
                
                default: System.out.println("[Packets: " + side +"] WRONG PACKET CODE: " + inputStream.readInt());
                }
            } catch (IOException e) { e.printStackTrace(); }
    }
    
    private void packetReaderFromServer(DataInputStream inputStream, Player player) {
        
        try {
            switch(inputStream.readInt()) {
            case 11: Speaker.speakToPlayerCient(player); break;
            
            default: System.out.println("[Packets: " + side +"] WRONG PACKET CODE: " + inputStream.readInt());
            }
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    /**
     * Отправляет сообщение на сервер
     * @param player
     * @param message
     */
    
    public static void sendQuickPacketToServer(EntityPlayer player, int message) {
        
            ByteArrayOutputStream bos = new ByteArrayOutputStream(8);
            DataOutputStream outputStream = new DataOutputStream(bos);
            try {
                    outputStream.writeInt(message);
            } catch (Exception ex) {
                    ex.printStackTrace();
            }
            
            Packet250CustomPayload packet = new Packet250CustomPayload();
            packet.channel = ModInfo.CHANNEL;
            packet.data = bos.toByteArray();
            packet.length = bos.size();
            
            EntityClientPlayerMP sender = (EntityClientPlayerMP) player;
            sender.sendQueue.addToSendQueue(packet);
           
    }
    
    /**
     * Отправляет пакет на клиент(игроку)
     * @param player
     * @param message
     */
    
    public static void sendQuickPackageToPlayer(EntityPlayer player, int message) {
        
        ByteArrayOutputStream bos = new ByteArrayOutputStream(8);
        DataOutputStream outputStream = new DataOutputStream(bos);
        try {
                outputStream.writeInt(message);
        } catch (Exception ex) {
                ex.printStackTrace();
        }
        
        Packet250CustomPayload packet = new Packet250CustomPayload();
        packet.channel = ModInfo.CHANNEL;
        packet.data = bos.toByteArray();
        packet.length = bos.size();
        
        PacketDispatcher.sendPacketToPlayer(packet, (Player)player);
    }
    
}
 
675
2
Код:
Speaker.speakToPlayerCient(player); break;
Жеш

Ещё писал Sys.out.print под
Код:
if (packet.channel.equals(ModInfo.CHANNEL)) {
Пакет отсылается единожды.
 
771
5
Скажу бред, но может быть if(!world.isRemote)?
 
104
0
Покажи мне метод speakToPlayerCient, пожалуйста)
[merge_posts_bbcode]Добавлено: 29.05.2014 21:38:42[/merge_posts_bbcode]

Majestic написал(а):
Скажу бред, но может быть if(!world.isRemote)?
Вот-вот, я тоже так думаю!
 
675
2
Забыл упомянуть:
Мод полностью серверный, а что бы не ошибиться, все модули стартуют под условием:
Код:
        if(event.getSide().isServer()) {
            Config.init(event.getModConfigurationDirectory());
            
            new SetConfig();
            
                        // шото
            
            Config.save();
        }
[merge_posts_bbcode]Добавлено: 29.05.2014 23:56:03[/merge_posts_bbcode]

Для примера(в данном случае я вставлял print'ы в  case 11: и sendQuickPackageToPlayer()):

Серверная консоль:
Код:
2014-05-29 22:53:27 [INFO] [STDOUT] Пакет отправлен
Клиентская консоль:
Код:
2014-05-29 22:53:27 [INFO] [STDOUT] Пакет пришел
2014-05-29 22:53:27 [INFO] [STDOUT] Пакет пришел
 
675
2
Понял ошибку. У меня два мода обрабатывали один PacketHandler.
Итак:
Код:
public class PacketHandler implements IPacketHandler {
    
    private Side side = FMLCommonHandler.instance().getEffectiveSide();

    @Override
    public void onPacketData(INetworkManager manager, Packet250CustomPayload packet, Player player) {
            if (packet.channel.equals(ModInfo.CHANNELTOSERVER)) {
                DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
                if(side == Side.SERVER) packetReaderFromClient(inputStream, player);
            }
            if(packet.channel.equals(ModInfo.CHANNELTOCLIENT)) {
                DataInputStream inputStream = new DataInputStream(new ByteArrayInputStream(packet.data));
                if(side == Side.CLIENT) packetReaderFromServer(inputStream, player);
            }
    }
    
    private void packetReaderFromClient(DataInputStream inputStream, Player player) {
            try {
                switch(inputStream.readInt()) {
                /*
                case 0: {
                    System.out.println("[" + side + "] YEY! (Сообщение пришло на сервер)"); break;
                }
                */
                
                default: System.out.println("[Packets: " + side +"] WRONG PACKET CODE: " + inputStream.readInt());
                }
            } catch (IOException e) { e.printStackTrace(); }
    }
    
    private void packetReaderFromServer(DataInputStream inputStream, Player player) {
        
        try {
            switch(inputStream.readInt()) {
            case 11: Speaker.speakToPlayerCient(player, 1); break; // Speaker.speakToPlayerCient(player);
            
            default: System.out.println("[Packets: " + side +"] WRONG PACKET CODE: " + inputStream.readInt());
            }
        } catch (IOException e) { e.printStackTrace(); }
    }
    
    /**
     * Отправляет сообщение на сервер
     * @param player
     * @param message
     */
    
    public static void sendQuickPacketToServer(EntityPlayer player, int message) {
            EntityClientPlayerMP sender = (EntityClientPlayerMP) player;
            sender.sendQueue.addToSendQueue(intToPacket(message, ModInfo.CHANNELTOSERVER));
    }
    
    /**
     * Отправляет пакет на клиент(игроку)
     * @param player
     * @param message
     */
    
    public static void sendQuickPacketToPlayer(EntityPlayer player, int message) {
        PacketDispatcher.sendPacketToPlayer(intToPacket(message, ModInfo.CHANNELTOCLIENT), (Player)player);
    }
    
    private static Packet250CustomPayload intToPacket(int message, String channel) {
        ByteArrayOutputStream bos = new ByteArrayOutputStream(8);
        DataOutputStream outputStream = new DataOutputStream(bos);
        try {
                outputStream.writeInt(message);
        } catch (Exception ex) {
                ex.printStackTrace();
        }
        
        Packet250CustomPayload packet = new Packet250CustomPayload();
        packet.channel = channel;
        packet.data = bos.toByteArray();
        packet.length = bos.size();
        
        return packet;
        
    }

Серверное ядро:
Код:
@NetworkMod(clientSideRequired = false, serverSideRequired = false, channels={ModInfo.CHANNELTOSERVER}, packetHandler = PacketHandler.class)

Клиентский мод:
Код:
@NetworkMod(clientSideRequired = true, serverSideRequired = true, channels={ModInfo.CHANNELTOCLIENT}, packetHandler = PacketHandler.class)

Вопросы:
1. Зачем в оф. форж-туториале делают if (packet.channel.equals(ModInfo.CHANNELTOSERVER)), когда там указывают канал в NetworkMod?
2. Есть ли способ получше? Скорее всего невозможно, но у меня была идея читать, какой мод сейчас слушает PacketHandler и обрабатывать тот или иной пакет той или иной стороной.
 
Сверху