Capability 1.12.2 (сервер -> клиент при заходе в мир)

627
72
178
сегодня открыл для себя способ синхронизации капабилити на 1.12.2 при заходе в мир. наверное многие о нем знают, но все же, вдруг кому понадобится.
Java:
  @SubscribeEvent
    public void entityJoinWorld(EntityJoinWorldEvent evt) {
    if (!(evt.getEntity() instanceof EntityPlayer)) // если сущность не игрок - выходим из метода.
        return;
    EntityPlayer player = (EntityPlayer) evt.getEntity(); // сохраняем игрока в переменную
    if (!player.world.isRemote) // если сервер - выходим из метода
        return;
        if (player != null) { //если игрок существует
        CAPAttributesProvider.sendSyncRequest(); //отсылаем пакет на сервер, о том, что нужно синхронизировать клиент
        }
    }
}
в свою очередь, Request-пакет запускается на сервере и отсылает на клиент пакет о синхронизации всех данных капы.
Java:
@Override
    public IMessage onMessage(Request message, MessageContext ctx) {
        EntityPlayer player = ctx.getServerHandler().player; //получаем серверного игрока
        ICAPAttributes cap = CAPAttributesProvider.getAttributesCap(player); //получаем капу (мой метод для удобства)
        CAPAttributesProvider.sendSyncToClient((EntityPlayerMP) player, cap.getAllAttributes()); //отсылаем пакет  синхронизации
        System.out.println("SYNC HAS REQUESTED"); //дебаг SYSOUT
        return null;
    }
пишите замечания в коде, если есть - обязательно исправлю)
 

tox1cozZ

aka Agravaine
8,454
598
2,890
Видел у некоторых такое. А зачем? Я всегда синхронизирую Capability/IEEP в PlayerLoggedInEvent и все отлично работает.
Он вызывается только на сервере, сразу отсылаю пакет клиенту.
 
627
72
178
Очень странно что тебя не крашит. PlayerLoggedInEvent и EntityJoinWorldEvent срабатывают раньше, чем создался игрок и аттачилась капа. Если отправить сразу пакет на клиент - будет краш, т.к ты пытаешься получить капу синглплеер игрока, а его не существует, как и капы.
 
627
72
178
Вот именно, у IEEP всё работает нормально. в 1.7.10 EntityJoinWorldEvent и PlayerLoggedInEvent выполнялись, когда игрок был уже создан.
А у капы и 1.12.2 иной случай
 
627
72
178
Да я вот офигел когда увидел, что у меня крашится из-за нуля капы на клиенте при попытке традиционной синхронизации.
 

Eifel

Модератор
1,623
78
608
На 1.7.10 тоже такое встречалось, но я видел метод более солидный, к примеру, как посоветовал Зиг:
eDqFoag.png
 
627
72
178
Почитал ваши сообщения, стало как-то стыдно XD
Я пишу на 1.12.2 и никогда так не делал. Все пакеты у меня пашут без проблем.
 
Сверху