List и способы его использования

Версия Minecraft
1.7.10
106
8
19
Решил сделать радар и не на клиентском loadedEntityList,а на серверном.Написал пакеты,вроде как всё должно работать,но есть одно но.Так как я не нашел способа передачи листа в пакете я решил создать свой объект(класс) энтити и использовать это как List<myentityclass> = new ArrayList<myentityclass>(); * Мой класс myentityclass принимает 4 параметра(x,y,z,id) * и на каждый пакет я просто добавляю в лист энтити.но и тут всё не так просто,если сделать это,то при каждом пакете сохраняются энтити на радаре.решил на каждом пакете сначала list.clear() и только после этого add ,но при этом радар начинает моргать и это не очень такой выход.решил
Java:
            for(int i = 0; i < list.size(); i++)
            {
                if(list.get(i).uid == uid)
                {
                    list.get(i).x = x;
                    list.get(i).y = y;
                    list.get(i).z = z;
                    return;
                }
            }
но сейчас тоже есть проблемы.если энтити умирает то объект остается в листе.
Есть ли решения этой проблемы?Может как то можно отсеить те ID которые были и которых не стало в некст пакете?
 
Решение
Java:
    private List<RadarEntry> entries;
    public SPacketEntityList() {}
    public SPacketEntityList(List<RadarEntry> entries) {
        this.entries = entries;
    }

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(entries.size());
        for(RadarEntry entry : entries){
            buf.writeDouble(entry.posX);
            buf.writeDouble(entry.posY);
            buf.writeDouble(entry.posZ);
        }
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        int count = buf.readInt();
        entries = Lists.newArrayListWithCapacity(count);
        for(int i = 0; i < count; i++){
            entries.add(new RadarEntry(buf.readDouble(), buf.readDouble(), buf.readDouble()));
        }
    }...
106
8
19
Ты думаешь меня это интересует?Ну вот смотри тогда отличие между клиентским(справа),серверным(слева).
zLzElcVveYo.jpg


просто сервер дальше грузит чанки чем клиент и радар работает на более большой дистанции.
 
106
8
19
В настройках клиента есть такая настройка как прогрузка чанков.
Удачи на клиенте грузить чанки на дистанции 200 блоков.
@Agravaine
А зачем фулл пакет?Ну ладно,на.
Java:
    public double x, y, z, id, uid;
    public SPacketEntityList() {}
    public SPacketEntityList(double x,double y, double z, double id, double uid) {this.x = x; this.y = y; this.z = z; this.id = id; this.uid = uid;}

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeDouble(x);
        buf.writeDouble(y);
        buf.writeDouble(z);
        buf.writeDouble(id);
        buf.writeDouble(uid);
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        x = buf.readDouble();
        y = buf.readDouble();
        z = buf.readDouble();
        id = buf.readDouble();
        uid = buf.readDouble();
    }

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

        @Override
        public IMessage onMessage(SPacketEntityList packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(SPacketEntityList packet) {
            SimpleEntity sp = new SimpleEntity(packet.x, packet.y, packet.z, packet.id, packet.uid);
            List<SimpleEntity> list = DayZInterface.entitylist; 
            for(int i = 0; i < list.size(); i++)
            {
                if(list.get(i).uid == packet.uid)
                {
                    list.get(i).x = packet.x;
                    list.get(i).y = packet.y;
                    list.get(i).z = packet.z;
                    return;
                }
            }
            list.add(sp);
        }
        private void act(EntityPlayerMP player, SPacketEntityList packet) {
        }
    }
        }
 
7,099
324
1,510
Сделай вместо листа Map<UUID, Entity>, не очищай ее, а просто вставляй в нее обновленные Entity
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Ха, так у тебя логика неправильная вообще.
Ты пакет лишь одного "энтити" передаешь, а тебе нужен список.
То бишь в конструктор ты должен передавать уже список энтитей.
В act собсна делать DayZInterface.entitylist = твой_считанный_лист;
 
7,099
324
1,510
Так как я не нашел способа передачи листа в пакете
~~~
А вообще, это можно даже с пользой использовать - отправлять пакеты только если энтити подвинется
 

GoogleTan

Картошка :3
1,354
43
310
10 чанков, то хоть 100500 чанков поставь прорисовку - ничего не будет.
Он сказал, что сервер прогружает больше чем клиент. Так раз на сервере 10 максималка, то и на клиенте просто ставим 11 и не паримся - все проблема решена.
 
106
8
19
Ха, так у тебя логика неправильная вообще.
Ты пакет лишь одного "энтити" передаешь, а тебе нужен список.
То бишь в конструктор ты должен передавать уже список энтитей.
В act собсна делать DayZInterface.entitylist = твой_считанный_лист;
Если честно я решил скопировать с хкса это но так как думал что он находится под обф решил сначала сам написать.после того как сам написал и выявил у себя некую ошибку решил чекнуть что у него.оказалось прям почти что 1в1.мне кажется что всё таки нужно разобраться с моим листом либо же делать как сказал @hohserg1
 
106
8
19
Он сказал, что сервер прогружает больше чем клиент. Так раз на сервере 10 максималка, то и на клиенте просто ставим 11 и не паримся - все проблема решена.
Нет ну ты реально видимо не понял что мы хотим сделать..во первых на клиенте это у тебя будет жрать производительность,во вторых на таком расстоянии и сервер будет очень нагружаться,в третьих смысл делать костыль?вдруг я хочу поставить это на несколько серверов?и что теперь на каждом дистанцию менять?
 
106
8
19
Ха, так у тебя логика неправильная вообще.
Ты пакет лишь одного "энтити" передаешь, а тебе нужен список.
То бишь в конструктор ты должен передавать уже список энтитей.
В act собсна делать DayZInterface.entitylist = твой_считанный_лист;
Бтв мб у меня реально брокен логика он ПОЧЕМУ ТО пакеты реально приходят и даже не нагружают клиент/сервак.(на сервере отсылаю лоадед энтити лист используя параметры x,y,z,uid из класса Entity)
 

tox1cozZ

aka Agravaine
8,455
598
2,892
Java:
    private List<RadarEntry> entries;
    public SPacketEntityList() {}
    public SPacketEntityList(List<RadarEntry> entries) {
        this.entries = entries;
    }

    @Override
    public void toBytes(ByteBuf buf) {
        buf.writeInt(entries.size());
        for(RadarEntry entry : entries){
            buf.writeDouble(entry.posX);
            buf.writeDouble(entry.posY);
            buf.writeDouble(entry.posZ);
        }
    }

    @Override
    public void fromBytes(ByteBuf buf) {
        int count = buf.readInt();
        entries = Lists.newArrayListWithCapacity(count);
        for(int i = 0; i < count; i++){
            entries.add(new RadarEntry(buf.readDouble(), buf.readDouble(), buf.readDouble()));
        }
    }

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

        @Override
        public IMessage onMessage(SPacketEntityList packet, MessageContext message) {
            if (message.side.isClient())
                act(packet);
            else
                act(message.getServerHandler().playerEntity, packet);
            return null;
        }

        @SideOnly(Side.CLIENT)
        private void act(SPacketEntityList packet) {
            DayZInterface.entitylist = packet.entries;
        }
    }

    public static class RadarEntry{
        public double posX, posY, posZ;
    }
}
 
Сверху