Problème capabilités

GreenTree0

Mineur des cavernes
25 Janvier 2019
54
2
28
Hey hey,
Après avoir longuement arrêté le modding Mc pour m'orienter vers la programmation Spigot, j'ai décider de revenir car Spigot commencait à montrer ses limites, ainsi je me suis lancé dans un petit projet, mais j'ai été arrêté très tôt, car j'ai du mal avec le système de Capabilités.
En effet, mon mod est en 1.14.4 et il n'y a aucun tutoriel en cette version a part la documentation officielle qui n'est pas claire du tout, j'ai suivi des tonnes de tutoriels sur les autres versions mais j'arrivais toujours a quelque chose qui n'existait plus au final et qui avait changer entre temps, j'ai réussis à un peu avancer, mais j'ai finis par rebloquer et donc je viens sur ce forum pour trouver une solution à ce problème, ainsi qu'être sur que je m'y suis bien pris, sachant que c'est tout nouveau pour moi.

Le problème que je rencontre c'est au niveau de la récupération de la valeur d'une capabilité, je ne suis même pas sur de l'avoir bien créer, voici mon code :

Interface IPrestige :
Java:
package com.rewelias.fantasia.capabilities;

public interface IPrestige {
    
    
    public void setPrestige(Integer nb);
    public Integer getPrestige();

}

Classe Prestige:
Java:
package com.rewelias.fantasia.capabilities;

import net.minecraft.nbt.IntNBT;
import net.minecraftforge.common.util.INBTSerializable;

public class Prestige implements IPrestige, INBTSerializable<IntNBT> {
    public Integer prestige;
    
    public Prestige() {
        prestige = 0;
    }
    
    @Override
    public void setPrestige(Integer nb) {
        this.prestige = nb;
    }

    @Override
    public Integer getPrestige() {
        return this.prestige;
    }

    @Override
    public IntNBT serializeNBT() {
        IntNBT nbt = new IntNBT(getPrestige());
        return nbt;
    }

    @Override
    public void deserializeNBT(IntNBT nbt) {
        this.prestige = nbt.getInt();
    }

}

Classe ModCapabilities :
Java:
package com.rewelias.fantasia.capabilities;

import net.minecraft.nbt.INBT;
import net.minecraft.util.Direction;
import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.capabilities.Capability.IStorage;
import net.minecraftforge.common.capabilities.CapabilityInject;
import net.minecraftforge.common.capabilities.CapabilityManager;

public class ModCapabilities {
    
    @CapabilityInject(IPrestige.class)
    public static final Capability<IPrestige> PRESTIGE = null;
    
    public static void registerCapabilities() {
        CapabilityManager.INSTANCE.register(IPrestige.class, new CapabilityPrestige(), Prestige::new);
    }
    
    public static class CapabilityPrestige implements IStorage<IPrestige> {

        @Override
        public INBT writeNBT(Capability<IPrestige> capability, IPrestige instance, Direction side) {
            // TODO Auto-generated method stub
            return null;
        }

        @Override
        public void readNBT(Capability<IPrestige> capability, IPrestige instance, Direction side, INBT nbt) {
            // TODO Auto-generated method stub
            
        }
        
    }
}

Et code pour récupérer :
Java:
    @SubscribeEvent
    public static void onPlayerJoin(PlayerLoggedInEvent event){
        PlayerEntity player = event.getPlayer();
        LazyOptional<IPrestige>  prestige = player.getCapability(ModCapabilities.PRESTIGE, null);
        
        player.sendMessage(new StringTextComponent("Ton prestige : " + prestige.toString()));
    }


J'ai également des questions en générales auxquelles je n'ai pas pu trouver de réponses claires sur Forge :

Les capabilités sont-t-elles le seul moyen de stocker des données dans les joueurs ? Ou du moins le moyen le plus opti ?

Est-ce qu'une fois les données stockées dans un joueurs grâce aux capabilités, j'ai moyen de les récupérer depuis un autre joueur à l'aide de commandes, en clair j'ai besoin que les données stockées dans le joueur soit accessible au niveau serveur, est-ce possible ? Sinon comment le faire ? (par ex pour un système d'argent)

Ou trouver des bons tutoriels en 1.14.4 ? x_x C'est très mal documenté!

Merci d'avance :)
 
Bonsoir,
Il faut faire :
Code:
player.getCapability(ModCapabilities.PRESTIGE, null).ifPresent(prestige -> {
     player.sendMessage(new StringTextComponent("Ton prestige : " + prestige.getPrestige()));
});

Les capabilités sont le meilleur moyen pour attacher des données à toutes sortes d'objet (entité, entité de bloc, chunk, etc.).

Les quelques tutoriels 1.13.x qu'on a sur MFF fonctionne aussi pour la plupart en 1.14.4.