- 113
- 7
- 7
Доброго времени суток
Есть капа:
///
Выводит
Я уже много что пробывал и другой тест и т.д все равно капы нету
Прошу помочь
В действительности капа другая но ошибка та же....
Код этой капы может содержать ошибки.....
Есть капа:
Cap:
package com.mr_toad.ex.common.caps;
public interface Cap {
int getValue();
void setValue(int vn);
}
CapClass:
package com.mr_toad.ex.common.caps;
public class CapClass implements Cap {
private int v = 0;
@Override
public int getValue() {
return this.v;
}
@Override
public void setValue(int vn) {
this.v = vn;
}
}
CapProvider:
package com.mr_toad.ex.common.caps;
import net.minecraft.core.Direction;
import net.minecraft.nbt.CompoundTag;
import net.minecraft.nbt.Tag;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.CapabilityManager;
import net.minecraftforge.common.capabilities.CapabilityToken;
import net.minecraftforge.common.capabilities.ICapabilitySerializable;
import net.minecraftforge.common.util.LazyOptional;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
public class CapProvider implements ICapabilitySerializable<Tag> {
private CapClass capability = null;
private final LazyOptional<Cap> holder = LazyOptional.of(this::create);
public static final Capability<Cap> CAPA = CapabilityManager.get(new CapabilityToken<>(){});
@Override
public @NotNull <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
if (cap == CAPA) {
return this.holder.cast();
}
return LazyOptional.empty();
}
@Override
public Tag serializeNBT() {
Cap cap = this.create();
CompoundTag nbt = new CompoundTag();
nbt.putInt("Value", cap.getValue());
return nbt;
}
@Override
public void deserializeNBT(Tag nbt) {
Cap cap = this.create();
if (nbt instanceof CompoundTag compoundNbt) {
cap.setValue(compoundNbt.getInt("Value"));
}
}
private CapClass create() {
if(this.capability == null) {
this.capability = new CapClass();
}
return this.capability;
}
}
///
Добавление, регистрация и тест:
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.entity.LivingEntity;
import net.minecraftforge.common.capabilities.RegisterCapabilitiesEvent;
import net.minecraftforge.event.AttachCapabilitiesEvent;
import net.minecraftforge.event.TickEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.LogicalSide;
import net.minecraftforge.fml.common.Mod;
@Mod.EventBusSubscriber(modid = Ex.MODID)
public class Events {
@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
event.register(Cap.class);
}
@SubscribeEvent
public static void attachCapability(AttachCapabilitiesEvent<LivingEntity> event) {
if (event.getObject() instanceof Player player && player.getCapability(CapProvider.CAPA).resolve().isEmpty()) {
event.addCapability(new ResourceLocation(Ex.MODID, "test"), new CapProvider());
}
}
@SubscribeEvent
public static void onPlayerTick(TickEvent.PlayerTickEvent event) {
if(event.side == LogicalSide.SERVER && event.player.getRandom().nextInt(5) == 0) {
event.player.getCapability(CapProvider.CAPA).resolve().ifPresentOrElse(c -> Ex.LOGGER.info("Cap : {} present", c)), () -> Ex.LOGGER.error("Cap : {} empty", c));
}
}
}
Выводит
[времячетотам] [логгерчетотам/ERROR] "Cap {...} empty"
Я уже много что пробывал и другой тест и т.д все равно капы нету
Прошу помочь
В действительности капа другая но ошибка та же....
Код этой капы может содержать ошибки.....