Проблемы с Capability 1.16.5

Версия Minecraft
1.16.5
API
Forge
76
3
5
Cоздал интерфейс
Java:
public interface NewLevelSystem {
        public void setLevel(float pointsLevel);
        public void addExp(float points);

        public float getLevel();
    }

Затем создал методы
Java:
public class Levels implements RpgMod.NewLevelSystem {
    private float level = 0.0f;

    @Override
    public void setLevel(float points) {
        this.level = points;
    }

    @Override
    public void addExp(float points) {
        this.level += points;
    }

    @Override
    public float getLevel() {
        return this.level;
    }
}

И теперь мне нужно их записывать, пытаюсь записать их так
Java:
public class LevelStorage implements Capability.IStorage<RpgMod.NewLevelSystem> {
    @Nullable
    @Override
    public INBT writeNBT(Capability<RpgMod.NewLevelSystem> capability, RpgMod.NewLevelSystem instance, Direction side) {
        return new FloatNBT(instance.getLevel());
    }

    @Override
    public void readNBT(Capability<RpgMod.NewLevelSystem> capability, RpgMod.NewLevelSystem instance, Direction side, INBT nbt) {
        instance.set(((NBTPrimitive) nbt).getFloat());
    }
}

Но как я понял, NBTPrimitive из старых версий форджа.
Ещё ругается на FloatNBT говорит, что он приватный, аналога я не нашёл.

И так, где я ошибся или как сделать правильно?
 
76
3
5
Такссс, ну, я в край запутался в логике того, что я делаю, нужна помощь.
И так, понял что я делал выше скорее всего было не правильным, так что переписал всё ещё разок.

1.Создаю интерфейс ICapability
Java:
public interface ICapability {
        float getValue();
        void addValue(float value);
        void setValue(float value);
    }

2.Создаю класс DataCapability от ICapability
Java:
public class DataCapability implements RpgMod.ICapability {

    private float CustomLevel = 0.0f;

    @Override
    public float getValue() {
        return this.CustomLevel;
    }

    @Override
    public void addValue(float value) {
        this.CustomLevel += value;
    }

    @Override
    public void setValue(float value) {
        this.CustomLevel = value;
    }
}

3.Созда. хранилище Storage
Java:
public class Storage implements Capability.IStorage<RpgMod.ICapability>{

    @Override
    public INBT writeNBT(Capability<RpgMod.ICapability> capability, RpgMod.ICapability instance, Direction side) {
        CompoundNBT compound = new CompoundNBT();
        compound.putFloat(CustomLevel, instance.getValue());
        return compound;
    }

    @Override
    public void readNBT(Capability<RpgMod.ICapability> capability, RpgMod.ICapability instance, Direction side, INBT nbt) {
        instance.setValue(((CompoundNBT) nbt).getFloat(CustomLevel));
    }
}

4.Создаю класс провайдера CapabilityProvider
Java:
public class CapabilityProvider implements ICapabilitySerializable<INBT> {

    private final DataCapability playerLevel = new DataCapability();
    private final Capability.IStorage<DataCapability> storage = PLAYER_LEVEL.getStorage();

    @Nonnull
    @Override
    public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
        if (cap.equals(PLAYER_LEVEL)) return LazyOptional.of(() -> playerLevel).cast();
        else return LazyOptional.empty();
    }

    @Override
    public INBT serializeNBT() {
        return storage.writeNBT(PLAYER_LEVEL, playerLevel, null);
    }

    @Override
    public void deserializeNBT(INBT nbt) {
        storage.readNBT(PLAYER_LEVEL, playerLevel, null, nbt);
    }
}

5.Пытаюсь все эти классы поместил в один класс LevelCapability, но всё безуспешно, пока не понимаю, как фиксить эти ошибки, закомментировал 4 последние строчки.
Java:
public class LevelCapability {
    @CapabilityInject(DataCapability.class)
    public static Capability<DataCapability> PLAYER_LEVEL;
    public static String CustomLevel = "CustomLevel";

    public interface ICapability {}
    public static class DataCapability implements ICapability {}
    public static class Storage implements Capability.IStorage<DataCapability> {} // выдаёт эту ошибку Class 'Storage' must either be declared abstract or implement abstract method 'writeNBT(Capability<T>, T, Direction)' in 'IStorage'
    public static class CapabilityProvider implements ICapabilitySerializable<INBT> {} // выдаёт эту ошибку Class 'CapabilityProvider' must either be declared abstract or implement abstract method 'getCapability(Capability<T>, Direction)' in 'ICapabilityProvider'
}

6.Создал CapabilityRegistry
Java:
public class CapabilityRegistry {
    public static void init() {
        CapabilityManager.INSTANCE.register(RpgMod.ICapability.class, new Storage(), DataCapability::new);
    }
}

7.Регистрация в главном классе мода
Java:
private void setup(final FMLCommonSetupEvent event) {
        CapabilityRegistry.init();
    }

8.Пытаюсь проверить работоспособность
Java:
@SubscribeEvent
    public static void AddCapabilities(AttachCapabilitiesEvent<Entity> event) {
        if (event.getObject() instanceof PlayerEntity && event.getObject() instanceof FakePlayer) {
            event.addCapability(new ResourceLocation(RpgMod.MOD_ID, ("level")), new CapabilityProvider());

            System.out.println("\u001B[32m" + "Test1122334455");
        }
    }

Ивент не отрабатывает...

Хотел узнать почему код не отрабатывает, и есть ли в нём ошибки?
Впервые работаю с Capability да и вообще первый мод.
 
1,369
112
241
3. Ты неправильно регаешь NBT. У него структура "название" : знач, ты же пытаешься сделать знач : знач.
5. Ты делаешь что-то не то. Зачем тебе INSTANCE каждого твоего класса? Вызывай напрямую с их классов, без посредника в виде LevelCapability.class
8. Условие неверно. У тебя игрок должен быть и настоящим, и фейковым. Либо ставь ИЛИ, либо вообще не проверяй на фейкового игрока. Далее, вызывается ли сам эвент? Скорее всего ты забыл поставить над классом @Mod.EventBusListener (дай бог памяти), либо зарегать этот класс как EventBusListener в гл. классе (типикал ошибки новичков в моддинге).

Ну и CustomLevel желательно сделать в camelCase ("customLevel"), это позволит поддерживать общий кодстайл.
 
76
3
5
Теперь я хочу проверить сработает ли сам ивент.

Но он теперь ругается на саму проверку
Java:
event.getObject() instanceof PlayerEntity
Inconvertible types; cannot cast 'javax.swing.text.html.parser.Entity' to 'net.minecraft.entity.player.PlayerEntity'

и по этой же ошибке не даёт создать
Java:
PlayerEntity Player = (PlayerEntity) event.getObject();

вот сам ивент
Java:
@Mod.EventBusSubscriber(modid = LevelsMod.MOD_ID, bus = Mod.EventBusSubscriber.Bus.FORGE, value = Dist.CLIENT)
public class ClientEvent {
    @SubscribeEvent
    public static void AddCapabilities(AttachCapabilitiesEvent<Entity> event) {
        if (event.getObject() instanceof PlayerEntity) {
            event.addCapability(new ResourceLocation(LevelsMod.MOD_ID, ("levels")), new ProviderCapability());

            PlayerEntity Player = (PlayerEntity) event.getObject();

            Player.getCapability(PLAYER_LEVEL).ifPresent(Data -> Data.setLevel(10));
//            Player.getCapability(PLAYER_LEVEL).ifPresent(Data -> Value = Data.getLevel());

            System.out.println("\u001B[32m" + "Test");
        }
    }

я не панимать, что он от меня хотеть...
 
Сверху