16 janv. 2023, 13:28

Bonjour à tous,

Je suis actuellement en train de me former au modding minecraft. Je suis actuellement en train d’essayer de mettre en place les capability en 1.19.2. Je me suis aidé de différentes sources dont le tuto présent ici. Mais j’ai combler les parties dépréciées avec des infos glané ici et là sur internet et je pense qu’à la fin j’ai fait n’importe quoi 😐 . Puisque j’ai un magnifique crash du serveur avec l’erreur suivante :

java.lang.NoClassDefFoundError: Could not initialize class com.modtutorial.capability.MyCapabilityProvider

Voici un peu les fragments de code que j’imagine être coupable, je pense que ça doit être une erreur bien stupide mais je la vois pas 😅 .

@Mod(ModTutorial.MOD_ID)
public class ModTutorial {
	       // la constante avec l'identifiant du mod
		   public static final String MOD_ID = "modtutorial";
		   // le logger du mod
	   public static final Logger LOGGER = LogManager.getLogger(MOD_ID);
	   
		   // constructeur de la classe principale, on enregistre ici nos events
	   public ModTutorial() {
		   FMLJavaModLoadingContext.get().getModEventBus().addListener(this::setup);
		   FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientSetup);
		   FMLJavaModLoadingContext.get().getModEventBus().addListener(this::serverSetup);
		   MinecraftForge.EVENT_BUS.addListener(EventPriority.HIGH,this::onExplosion);
		   MinecraftForge.EVENT_BUS.register(MyCapabilityAttacher.class);

		   IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
[...]
public class MyCapabilityAttacher {

    @SubscribeEvent
    public static void attach(final AttachCapabilitiesEvent<Entity> event) {
        final MyCapabilityProvider provider = new MyCapabilityProvider();
        
        event.addCapability(MyCapabilityProvider.IDENTIFIER, provider);
        System.out.println("attach capability");
    }

    private MyCapabilityAttacher() {
    }
}
public class MyCapabilityProvider implements ICapabilityProvider, INBTSerializable<CompoundTag> {

    public static final ResourceLocation IDENTIFIER = new ResourceLocation(ModTutorial.MOD_ID, "myCap");

    private final MyCapabilityInterface backend = new MyCapabilityImplementation();
    private final LazyOptional<MyCapabilityInterface> optionalData = LazyOptional.of(() -> backend);

    @NotNull
    @Override
    public <T> LazyOptional<T> getCapability(@NotNull Capability<T> cap, @Nullable Direction side) {
        return MyCapability.INSTANCE.orEmpty(cap, this.optionalData);
    }

    void invalidate() {
        this.optionalData.invalidate();
    }

    @Override
    public CompoundTag serializeNBT() {
        return this.backend.serializeNBT();
    }

    @Override
    public void deserializeNBT(CompoundTag nbt) {
        this.backend.deserializeNBT(nbt);
    }
}

En espérant que ça suffise,

Merci d’avance