1.12.2 getSubItem avec un item chargé en energie et un déchargé (API Energie Forge)



  • Bonjour,
    Je travaille actuellement sur un mod qui utilise l'API d'énergie de Forge (FE) sauf que je n'arrive pas a ajouter un item chargé et un autre déchargé dans l'onglet créatif.
    Je sais que l'api energétique de forge est tres similaire a l'API Redstone Flux de la CoFHTeam donc j'ai récupéré la méthode utilisée par Redstone Arsenal (un mod utilisant l'API Redstone Flux) et celle du CoFHCore.
    Sauf qu'elle ne semble pas fonctionner du tout étant donné que cette méthode modifie un tag nbt avec comme clef "Energy" alors que l'api de Forge semble utiliser un capability.
    Et, comme je ne connais pas les capabilities, je n'arrive pas a mettre une version chargée de mon objet dans l'onglet créatif.

    Voici la classe de mon item :

    public class EnergizedItemBase extends Item implements IEnergyStorage, IHasModel
    {
        protected int energy;
        protected int capacity;
        protected int maxReceive;
        protected int maxExtract;
        
        protected boolean showInCreative = true;
            
        public EnergizedItemBase(String name, int capacity, int maxReceive, int maxExtract, int energy)
        {
            this.capacity = capacity;
            this.maxReceive = maxReceive;
            this.maxExtract = maxExtract;
            this.energy = Math.max(0 , Math.min(capacity, energy));
            
            setUnlocalizedName(name);
            setRegistryName(name);
            setCreativeTab(ERST.ERST_TAB);
            
            ModItems.ITEMS.add(this);
        }
    
        @Override
        public int receiveEnergy(int maxReceive, boolean simulate)
        {
            if (!canReceive())
                return 0;
    
            int energyReceived = Math.min(capacity - energy, Math.min(this.maxReceive, maxReceive));
            if (!simulate)
                energy += energyReceived;
            return energyReceived;
        }
    
        @Override
        public int extractEnergy(int maxExtract, boolean simulate)
        {
            if (!canExtract())
                return 0;
    
            int energyExtracted = Math.min(energy, Math.min(this.maxExtract, maxExtract));
            if (!simulate)
                energy -= energyExtracted;
            return energyExtracted;
        }
    
        @Override
        public int getEnergyStored()
        {
            return energy;
        }
    
        @Override
        public int getMaxEnergyStored()
        {
            return capacity;
        }
    
        @Override
        public boolean canExtract()
        {
            return this.maxExtract > 0;
        }
    
        @Override
        public boolean canReceive()
        {
            return this.maxReceive > 0;
        }
        
        @SideOnly(Side.CLIENT)
        public void addInformation(ItemStack stack, @Nullable World playerIn, List<String> tooltip, ITooltipFlag advanced)
        {
            tooltip.add(getEnergyStored() + "/" + getMaxEnergyStored() + " FE");
        }
        
        @Override
        public void registerModels()
        {
            ERST.proxy.registerItemRenderer(this, 0, "inventory");
        }
        
        @Override
        public void getSubItems(CreativeTabs tab, NonNullList<ItemStack> items) {
    
            if (isInCreativeTab(tab) && showInCreative) {
                items.add(setDefaultEnergyTag(new ItemStack(this, 1, 0), 0));
                items.add(setDefaultEnergyTag(new ItemStack(this, 1, 0), capacity));
            }
        }
        
        public EnergizedItemBase setShowInCreative(boolean showInCreative) {
    
            this.showInCreative = showInCreative;
            return this;
        }
        
        public static ItemStack setDefaultEnergyTag(ItemStack container, int energy) {
    
            if (!container.hasTagCompound()) {
                container.setTagCompound(new NBTTagCompound());
            }
            System.out.println(container.getTagCompound().getInteger("Energy"));
            container.getTagCompound().setInteger("Energy", energy);
            
    
            return container;
        }
    }
    

    Je précise que les deux méthodes que j'ai recopiées sont getSubItems (vient de Redstone Arsenal) et setDefaultEnergyTag (de CofhCore)

    J'espère que vous serez en capacité de m'éclairer :D


  • Moddeurs confirmés Rédacteurs Administrateurs

    Bonjour,

    C'est le même principe, les capabilités de forge sont sauvegarder à travers le capabality storage dans le tag nbt de l'item.

    Ce qu'il te faut c'est trouver le bon nom du tag et pour ça regarder du côté de la classe ItemStack (pour trouver le nom du tag des capa de forge) ainsi que dans le storage de la capability d'énergie.



  • Problème réglé, l'item n'avait pas de tag, c'était a moi de le set. De plus, j'ai changé d'API, l'api Energie de Forge est tres compliquée a utiliser donc je me suis tourné vers l'api Redstone Flux (mais du coup mon mod en est dépendant, ce qui est dérangeant). Si vous le pouvez, ce serait cool de faire un tuto sur l'API énergie de forge, ça aiderait beaucoup de personnes voulant créer des mods d'énergie. En attendant, je pense peut être, si j'ai le temps faire un tuto sur l'api RedstoneFlux.

    Bref, je passe en résolu !
    Merci pour ton aide.


Log in to reply