HashMap в пакете

Версия Minecraft
1.7.10
477
7
51
Доброго времени суток, 2 день пытаюсь отправить пакет с мапой но всё четно, может кто сможет помочь с этим
Нужно отправить по сути мапу а на клиенте уже через фор добавить все данные в лист
Java:
    @SideOnly(Side.CLIENT)
    public void handleClientSide(PacketBuffer buf, byte id, Minecraft mc, WorldClient world,EntityClientPlayerMP player) {
        if(TeleportMod.isClient) {
          
            if(id == 0) {
                  int size = buf.readVarIntFromBuffer();
                    Map<Integer, String> map = Maps.newHashMapWithExpectedSize(size);
                    for(int i = 0; i < size; i++){
                        map.put(buf.readInt(), ByteBufUtils.readUTF8String(buf));
                    }
               }
      
        }
    }

    public void handleServerSide(PacketBuffer buf, byte id, WorldServer world, EntityPlayerMP player) {
        if(TeleportMod.isServer) {
            if(id == 0) {
                Map<Integer, String> map = Maps.newHashMap();
                map.put(0, "Azaza");
                map.put(1, "Hello");
                PacketBuffer bufmap = new PacketBuffer(Unpooled.buffer());
                bufmap.writeVarIntToBuffer(map.size());
      
                map.forEach((key, value) -> {
                    bufmap.writeVarIntToBuffer(key);
                    ByteBufUtils.writeUTF8String(bufmap, value);
                });
                TeleportMod.network.sendTo(TeleportMod.network.createPacket((byte)0,bufmap), player);
              
            }
          
        }
    }
Этот код мне предоставил Агравайн, на клиенте размер = 0, соответсвенно ничего не происходит :\
Нужно 1 раз отправить пакет с данными, я делал через цикл что явно не подходит каждый раз пакет приходит и очищая лист каждый раз в гуи остается последний пакет
 
Последнее редактирование:
477
7
51
1,200
37
237
buf.writeInt(map.size());
for (entry : map.entrySet()) {
buf.writeTYPE(entry.key);
buf.writeTYPE(entry.value);
}

map.clear();
size = buf.readInt();
for (i = 0; i < size; i++) {
key = buf.readTYPE();
value = buf.readTYPE();
map.put(key, value);
}

Еще можно упороться в сериализацию\десериализацию)0
 

timaxa007

Модератор
5,831
409
672
Легче сделать, но не легче для пакета.
Ключ String, значения этого ключа Integer - для ключа Map.
Ключ String, значения этого ключа String- для значения Map.
Место Integer и String.
 

tox1cozZ

aka Agravaine
8,456
598
2,892
Оптимизированное отправление и чтение интов. Если инт меньше 128 - отправится только один байт, меньше 32000 - два байта и так далее, а не четыре (размер инта).

buf.writeInt(map.size());
for (entry : map.entrySet()) {
buf.writeTYPE(entry.key);
buf.writeTYPE(entry.value);
}

map.clear();
size = buf.readInt();
for (i = 0; i < size; i++) {
key = buf.readTYPE();
value = buf.readTYPE();
map.put(key, value);
}

Еще можно упороться в сериализацию\десериализацию)0
Кайф, написал тоже самое что и у автора.
 
1,200
37
237
Ну я бы так и сделал)

Так если у него новый пакет очищает лист (ну в примере мапа каждый раз создается.. поэтому нужно просто вынесли в глобалку), то не проще просто очистку убрать? Всё равно значения будут новыми перезаписаны. А если поле в мапе было удалено, то как костыльное решение можно просто ключ со значением МАРКЕР отправлять, где на стороне сборки пакета просто по нему выпиливать существующий ключ.
 
477
7
51
477
7
51
класс сделай с переменными, и в лист засунь, как лист отправлять тебе точно показывали
ты щас описал мою задачу лол,но прикол в том что мне нужно и ключ и значение остылать а для этого у меня мапа
 
477
7
51
477
7
51
его способ как мой 1 изначально но чуть по другому, используя бафф и из него читая а не отправляя каждый раз пакет как получилось у меня изначально
Java:
public class TeleportInfoMessage implements IMessage {



    public Map<Integer, String> map;



    public TeleportInfoMessage() {}



    @Override

    public void toBytes(ByteBuf buf) {

        if (map == null || map.isEmpty()) return;

        buf.writeInt(map.size());

        for (Map.Entry<Integer, String> entry : map.entrySet()) {

            buf.writeInt(entry.getKey());

            ByteBufUtils.writeUTF8String(buf, entry.getValue());

        }

    }



    @Override

    public void fromBytes(ByteBuf buf) {

        if (buf.readableBytes() > 0) {

            map = new HashMap<Integer, String>();

            int size = buf.readInt();

            for (int i = 0; i < size; ++i) {

                map.put(buf.readInt(), ByteBufUtils.readUTF8String(buf));

            }

        }

    }



    public static class Handler implements IMessageHandler<TeleportInfoMessage, IMessage> {



        @Override

        public IMessage onMessage(TeleportInfoMessage packet, MessageContext message) {

            if (message.side.isClient())

                act(packet);

            else

                act(message.getServerHandler().playerEntity, packet);

            return null;

        }



        @SideOnly(Side.CLIENT)

        private void act(TeleportInfoMessage packet) {

            if (packet.map == null) return;

            Teleport.INSTANCE.clear();

            Teleport.INSTANCE.getMap().putAll(packet.map);

        }



        private void act(EntityPlayerMP player, TeleportInfoMessage packet) {

            TeleportInfoMessage message = new TeleportInfoMessage();

            message.map = Teleport.INSTANCE.getMap();

            TeleportMod.network.sendTo(message, player);

        }



    }



}
 
Сверху