[1.7.10] Проблема с рендером и проверкой кастомного инвертаря

Не знаю, у меня все как нужно с этим методом
 
А ты используешь ExtendedPlayerProperties вместе с этим методом? У меня же инвентарь держится на этом.
 
Да, знаю,что надо всем отсылать на клиент данные
 
Хм.. Тогда не знаю. У меня что-то оно криво работает. Могу ли я узнать пример твоего кода в ЛС? Мне нужен пример класса, наследующего интерфейс IExtendedPlayerProperties, если возможно. Если что, могу кинуть свой вариант.
 
Я так чую, что ты не синхронизируешь свои данные с клиентАМИ
 
Где их синхронизировать?
Я использую синхронизирующий пакет в ивентах onEntityJoinWorld(...), onLivingDeathEvent(...).
 
Код:
        if (event.entity instanceof EntityPlayerMP)
        {
            PacketDispatcher.sendTo(new SyncPlayerPropsMessage((EntityPlayer) event.entity), (EntityPlayerMP) event.entity);
        }
 
Код:
sendTo

Ты отсылаешь только Васе Пупкину, а надо всем. Все же должны видеть, что у Васи на спине,да?
[merge_posts_bbcode]Добавлено: 17.10.2015 12:04:04[/merge_posts_bbcode]

Передавай таг и id от энтити(ник длинный будет слишком) всем. Потом делай что-нибудь с этим(ты можешь получить игрока и его пропорции)
 
Тогда я вообще не знаю, каким способом. Я в пакетах дуб-дерево. У меня инвентарь работает и он прекрасно сохраняется. Мне нужно использовать метод PacketDispatcher.dispatcher.sendToAll(...);? Пакет, который я кидаю:
Код:
     private NBTTagCompound data;

     public SyncPlayerPropsMessage() {}

     public SyncPlayerPropsMessage(EntityPlayer player) 
     {
         data = new NBTTagCompound();
         ExtendedPlayer.get(player).saveNBTData(data);
     }
    
     @Override
     public void fromBytes(ByteBuf buffer) 
     {
         data = ByteBufUtils.readTag(buffer);
     }
    
     @Override
     public void toBytes(ByteBuf buffer) 
     {
         ByteBufUtils.writeTag(buffer, data);
     }
     public static class Handler extends AbstractClientMessageHandler<SyncPlayerPropsMessage> 
     {
         @Override
         public IMessage handleClientMessage(EntityPlayer player, SyncPlayerPropsMessage message, MessageContext ctx) 
         {
             ExtendedPlayer.get(player).loadNBTData(message.data);
             return null;
         }
     }
 
Ты же отсылаешь определённому игроку, а надо всем(иначе только ты будешь видеть)
 
Вот сейчас с точно такой же проблемой столкнулся, но я меняю скин.
Отсылаю пакет всем. У одного меняется скин, а другие этого не видят.

Пакет:
Код:
String playerName = ByteBufUtils.readUTF8String(buf);
            NBTTagCompound nbt = ByteBufUtils.readTag(buf);
            EntityClientPlayerMP syncPlayer = (EntityClientPlayerMP)world.getPlayerEntityByName(playerName);
            if(syncPlayer != null){
                MorasPlayer syncData = MorasPlayer.forPlayer(syncPlayer);
                if(syncData != null){
                    morasPlayer.loadNBTData(nbt);
                    if(morasPlayer.isSelectedRace()){
                        player.func_152121_a(Type.SKIN, morasPlayer.getPlayerSkin());
                    }
                }
            }
Отправка:
Код:
NBTTagCompound nbt = new NBTTagCompound();
                saveNBTData(nbt);

                FMLProxyPacket packet = MorasBooks.packetSender.createPacket(PacketHandler.SYNC_PLAYER_DATA, player.getCommandSenderName(), nbt);
                MorasBooks.packetSender.sendToDimension(packet, player.dimension);
В чем проблема?
 
Я вообще всем отсылаю, поэтому на клиенте можно взять любого игрока и достать его данные, даже если это не ты и он в другом измерении
 
Что там кидать? Почти то же самое, но отсылаю я не ник, а entityId и работает
 
Кароче, вроде разобрался.
Слать всем игрокам пакет нужно в PlayerEvent.StartTracking ивенте:
Код:
@SubscribeEvent
    public void onPlayerTracking(PlayerEvent.StartTracking e){
        if(e.target instanceof EntityPlayer){
            MorasPlayer data = MorasPlayer.forPlayer((EntityPlayer)e.target);
            
            NBTTagCompound nbt = new NBTTagCompound();
            data.saveNBTData(nbt);
    
            FMLProxyPacket packet = MorasBooks.packetSender.createPacket(PacketHandler.SYNC_PLAYER_DATA_ALL, e.target.getEntityId(), nbt);
            MorasBooks.packetSender.sendToAll(packet);
        }
    }
Сам пакет:
Код:
int playerId = buf.readInt();
            NBTTagCompound nbtAll = ByteBufUtils.readTag(buf);

            
            AbstractClientPlayer syncPlayer = (AbstractClientPlayer)world.getEntityByID(playerId);
            if(syncPlayer != null){
                MorasPlayer syncData = MorasPlayer.forPlayer(syncPlayer);
                if(syncData != null){
                    syncData.loadNBTData(nbtAll);
                    if(syncData.isSelectedRace()){
                        syncPlayer.func_152121_a(Type.SKIN, syncData.getPlayerSkin());
                    }
                }
            }
Ну и еще нужно слать похожий пакет только себе в EntityJoinWorldEvent, потому что StartTracking ивент не срабатывает если рядом нет других игроков.
Код:
@SubscribeEvent
    public void onPlayerJoin(EntityJoinWorldEvent e){
            if(!(e.entity instanceof EntityPlayerMP)){
                return;
            }

            EntityPlayer player = (EntityPlayer)e.entity;
            MorasPlayer data = MorasPlayer.forPlayer(player);
            
            if(data != null){
                NBTTagCompound nbt = new NBTTagCompound();
                data.saveNBTData(nbt);
                
                FMLProxyPacket packet = MorasBooks.packetSender.createPacket(PacketHandler.SYNC_PLAYER_DATA, nbt);
                MorasBooks.packetSender.sendTo(packet, (EntityPlayerMP)player);
            }
    }
Пакет:
Код:
MorasPlayer morasPlayer = MorasPlayer.forPlayer(player);
if(morasPlayer != null){
                NBTTagCompound nbtPlayer = ByteBufUtils.readTag(buf);
                
                morasPlayer.loadNBTData(nbtPlayer);
                if(morasPlayer.isSelectedRace()){
                    player.func_152121_a(Type.SKIN, morasPlayer.getPlayerSkin());
                }
            }
Вот так все отлично работает.
 
Спасибо, нашёл решение. Конечно не очень оптимизированное, но зато работает. Поэтому я не буду больше лезть XD
Думаю, закрывайте.
Код:
    @SubscribeEvent
    public void onLivingUpdate(LivingEvent.LivingUpdateEvent event)
    {
        if(event.entityLiving instanceof EntityPlayerMP)
        {
            ExtendedPlayer props = ExtendedPlayer.get((EntityPlayer) event.entityLiving);
            NBTTagCompound currentData = extendedEntityData.get(event.entityLiving.getEntityId());
            //^^^ - это хэшмап, в котором ключи -- ID
            NBTTagCompound newData = new NBTTagCompound();
            props.saveNBTData(newData);
            if (currentData==null)
            {
                extendedEntityData.put(event.entityLiving.getEntityId(), newData);
            }
            if (currentData!=null && newData!=null && !(currentData.equals(newData)))
            {
                extendedEntityData.put(event.entityLiving.getEntityId(), newData);
                PacketDispatcher.sendToAll(new SyncPlayerPropsMessage(event.entityLiving.getEntityId(), extendedEntityData.get(event.entityLiving.getEntityId())));
                //можно взять и newData, но я хотел немного некрасиво записать ;D
                props.setBackpackID(props.inventory.getBagSize());
            }
        }
    }
 
Назад
Сверху