Создание пакета для синхронизация capability

Версия Minecraft
1.16.5
29
2
0
Добрый день, друзья. Учусь работать с capability и нетворкингом.
В общем: у меня есть капабилити, которое хранит интовый айдишник. Этот айдишник обновляется в некотором гуи. Сделал пакет и при смене этот id на клиенте у одного из игроков отправляю для всего измерения пакет с обновлением. Но определённо делаю что то не то.

Пакет:
public class UpdateCapPacket extends AbstractMessage<UpdateCapPacket> {

    private int hatId;

    public UpdateCapPacket() {

    }

    public UpdateCapPacket(int id) {
        this.hatId = id;
    }

    @Override
    public void encode(UpdateCapPacket message, PacketBuffer buffer) {
        buffer.writeInt(message.hatId);
    }

    @Override
    public UpdateCapPacket decode(PacketBuffer buffer) {
        int id = buffer.readInt();
        return new UpdateCapPacket(hatId);
    }

    @Override
    public void handle(UpdateCapPacket message, Supplier<NetworkEvent.Context> ctx) {
        if (ctx.get().getDirection().getReceptionSide() == LogicalSide.CLIENT)
            ctx.get().enqueueWork(() ->
            {
                InfCust.LOGGER.error("[UPDATING CAP PACKET]");
                final Optional<World> optionalWorld = LogicalSidedProvider.CLIENTWORLD.get(ctx.get().getDirection().getReceptionSide());
                final LivingEntity livingEntity = ctx.get().getSender();
                InfCust.LOGGER.debug(ctx.get().getDirection());
                if (livingEntity != null) {
                    InfCust.LOGGER.error("[CHANGING CAP]");
                    optionalWorld.ifPresent(world -> InfCust.capabilityUtil.updateCapabilityHatId(message.hatId));
                }
                InfCust.LOGGER.error(InfCust.capabilityUtil.getCapabilityHatId());
            });
        ctx.get().setPacketHandled(true);
    }
}

Эвент открытия:
public void OpenCustMenu() {
        // Как пример
        Minecraft.getInstance().setScreen(new CustomizationScreen());
        PacketDispatcher.sendToAll(new UpdateCapPacket(-1));
    }
 
Причины могут быть разные. Например, ошибка в бизнес-логике. Чтобы уменьшиться вероятность совершения ошибки можно очистить код от шума. С этим может помочь ElegantNetworking
Пример того же самого пакета с использованием EN:
Java:
@ElegantPacket
public class UpdateCapPacket implements ServerToClientPacket {
    public final int hatId;
   
    public UpdateCapPacket(int hatId){
        this.hatId=hatId;
    }
       
       
    @OnlyIn(Dist.CLIENT)
    public void onReceive(Minecraft mc){
        InfCust.capabilityUtil.updateCapabilityHatId(hatId);
    }
}

new UpdateCapPacket(-1).sendToClients();


Кстати, проблема может быть ваще не в пакетах, как я понял, там у тебя большой мод и куча мест, где может работать неправильно. Отлаживай ¯\_(ツ)_/¯
 
Последнее редактирование:
Не знаю как на 1.16.5 реализовано, но, насколько помню, дефолтный обработчик пакетов имеет только один метод на отправку из клиента (ну собстна тупа на сервер). Если это так, то нужно уже с сервера всем на клиенты отправлять ответный пакет.
 
Назад
Сверху