- 16
- 3
- 0
Всем привет!
У меня появилась задача, сделать дополнительную характеристику игроку. К примеру взял выносливость (а так их будет очень много).
Посмотрел на форуме, вроде как лучше всего нужно использовать
Сперва хотел бы спросить, правильно ли я делаю?
Написал интерфейс
Далее класс
Следующий класс -
Класс провайдера (
Все эти классы поместил в один класс
Следующий мой шаг - класс
Конечный шаг - регистрация в главном классе мода:
Есть ли какие-то ошибки?
Какие шаги следующие?
Как проверить работоспособность?
Есть ли какие-то советы?
Впервые вообще с
Заранее спасибо!
У меня появилась задача, сделать дополнительную характеристику игроку. К примеру взял выносливость (а так их будет очень много).
Посмотрел на форуме, вроде как лучше всего нужно использовать
Capability
.Сперва хотел бы спросить, правильно ли я делаю?
Написал интерфейс
ICapability
:
Java:
public interface ICapability {
int getValue();
void addValue(int value);
void setValue(int value);
}
Далее класс
DataCapability
от ICapability
:
Java:
public static class DataCapability implements ICapability{
private int Stamina;
@Override
public int getValue() {
return this.Stamina;
}
@Override
public void addValue(int value) {
this.Stamina += value;
}
@Override
public void setValue(int value) {
this.Stamina = value;
}
}
Следующий класс -
Storage
:
Java:
public static class Storage implements Capability.IStorage<DataCapability> {
@Override
public INBT writeNBT(Capability<DataCapability> capability, DataCapability instance, Direction side) {
CompoundNBT compound = new CompoundNBT();
compound.putInt(Stamina, instance.getValue());
return compound;
}
@Override
public void readNBT(Capability<DataCapability> capability, DataCapability instance, Direction side, INBT nbt) {
instance.setValue(((CompoundNBT) nbt).getInt(Stamina));
}
}
Класс провайдера (
Provider
):
Java:
public static class Provider implements ICapabilitySerializable<INBT> {
private final DataCapability playerStamina = new DataCapability();
private final Capability.IStorage<DataCapability> storage = PLAYER_STAMINA.getStorage();
@Nonnull
@Override
public <T> LazyOptional<T> getCapability(@Nonnull Capability<T> cap, @Nullable Direction side) {
if (cap.equals(PLAYER_STAMINA)) return LazyOptional.of(() -> playerStamina).cast();
else return LazyOptional.empty();
}
@Override
public INBT serializeNBT() {
return storage.writeNBT(PLAYER_STAMINA, playerStamina, null);
}
@Override
public void deserializeNBT(INBT nbt) {
storage.readNBT(PLAYER_STAMINA, playerStamina, null, nbt);
}
}
Все эти классы поместил в один класс
StaminaCapability
:
Java:
public class StaminaCapability {
@CapabilityInject(DataCapability.class)
public static Capability<DataCapability> PLAYER_STAMINA;
public static String Stamina = "Stamina";
public interface ICapability {}
public static class DataCapability implements ICapability {}
public static class Storage implements Capability.IStorage<DataCapability> {}
public static class Provider implements ICapabilitySerializable<INBT> {}
}
Следующий мой шаг - класс
CapabilityRegistry
, который будет регистрировать все Capability
.
Java:
public class CapabilityRegistry {
public static void init() {
CapabilityManager.INSTANCE.register(StaminaCapability.DataCapability.class, new StaminaCapability.Storage(), StaminaCapability.DataCapability::new);
}
}
Конечный шаг - регистрация в главном классе мода:
Java:
private void setup(final FMLCommonSetupEvent event) {
CapabilityRegistry.init();
}
Есть ли какие-то ошибки?
Какие шаги следующие?
Как проверить работоспособность?
Есть ли какие-то советы?
Впервые вообще с
Capability
, да и вообще в моддинге.Заранее спасибо!
Последнее редактирование: