Синхронизация WorldSaveData

Версия Minecraft
1.11.2
1,015
9
102
Как синхронизировать данные WorldSaveData между сервером и клиентом? Посылать пакеты? У меня есть одна идейка: когда игрок заходит на сервер, то сервер ему посылает пакет с данными. Но мне это кажется костыльным, ибо в классе пакета все данные WorldSaveData придётся разбивать на составные части, что бы передать их. Как лучше сделать?
 
1,015
9
102
Dahaka написал(а):
Не костыльно. Так и нужно.
WorldSaveData же умеет упаковываться в NBT. Передай его на клиент и распакуй.

Вооот, теперь я знаю, что можно не разбивать дату. А так бы сделал как дурак. Спасибо


Dahaka написал(а):
Не костыльно. Так и нужно.
WorldSaveData же умеет упаковываться в NBT. Передай его на клиент и распакуй.

Так, а как передать NBTBase? Тут ток можно булевы, интеджеры и т.д. NBTBase тут нет
4d9e1b12d15382fab7652bae5357dbf2-full.png
 
1,015
9
102
Тут появилась еще одна проблема. Когда пытаюсь отправить пакет в эвенте PlayerEvent.PlayerLoggedInEvent, то в пакете на клиентской стороне player или же тот же Minecraft.getMinecraft().world равны null и из-за этого я не могу сохранить переданную WorldSaveData. Есть у кого идеи?
 
2,505
81
397
Ты хранишь инфу по игрокам в WorldSaveData? К сожалению, так не получится. Когда игрок залогинился на сервере, на клиенте еще не появились игроки. Нужно через EntityJoinWorldEvent с клиента отправлять запрос на синхронизацию.
 
1,015
9
102
Dahaka написал(а):
Ты хранишь инфу по игрокам в WorldSaveData? К сожалению, так не получится. Когда игрок залогинился на сервере, на клиенте еще не появились игроки. Нужно через EntityJoinWorldEvent с клиента отправлять запрос на синхронизацию.

Сделал, но почему-то при загрузки даты на сервере её нет. Она наверное еще не инициализировалась майном
Код:
    @SubscribeEvent
    public void entityJoin(EntityJoinWorldEvent e){
        if (e.getEntity() instanceof EntityPlayer){
            NetworkHandler.sendToServer(new PacketImplantSaveData(new ImplantsSaveData("")));
        }
    }
Код:
    @Override
    public void handleClientSide(PacketImplantSaveData message, EntityPlayer player) {
        ImplantsSaveData data = new ImplantsSaveData("implantsData");
        data.deserializeNBT(message.data);
        World world = Minecraft.getMinecraft().world;
        world.setData("implantsData", data);
    }

    @Override
    public void handleServerSide(PacketImplantSaveData message, EntityPlayer player) {
        World world = Minecraft.getMinecraft().world;
        ImplantsSaveData data = (ImplantsSaveData) world.loadData(ImplantsSaveData.class, "implantsData"); // data всегда null
        NetworkHandler.sendTo(new PacketImplantSaveData(data), (EntityPlayerMP) player);
    }


Может какой-нибудь костыль запилить?
 
Сверху