Jump to content

Problem with armor creation [1.16.4]


Tsurayamiku

Recommended Posts

I start develop my mod withou DeferredRegister, following the tutorials, but now I'm updating to DeferredRegister and I get stuck in my armor.

I created a enum for Armor Material extending IArmorMaterial and all works correctly, except for the repair material. After I change all the items to DeferredRegister and run the game I got the error "Registry Object not present".

I didn't got this error before update to DeferredRegisters. The Eclipse DOESN'T shows any error when I changed the ItemList.shukuryo to ItemList.SHUKURYO.get(). But the game doesn't load completely and gives the error.

I can't change the type of repairMaterial because it requires ingridient. What changes when I create an item with "public static Item" to "public RegistryObject<Item>"? How do I the correctly DeferredRegister item to the repairMaterial?

Link to comment
Share on other sites

Just now, kiou.23 said:

when are you calling ItemList.SHUKURYO.get()?

I'm calling on the ArmorMaterialList enum class, at the top, with the other properties.

shukuryo("shukuryo", 400, new int[] {8, 10, 9, 7}, 25, ItemList.SHUKURYO.get(), "item.armor.equip_netherite", 10, 10);

Link to comment
Share on other sites

Deferred Registers, well, defer the registration. so anytime before the common setup event, the object won't have been registered yet.

what you can do is, instead of giving the enum the item instance, give them a Supplier of the Item.

since the RegistryObject class implements Supplier, you can just pass the RegistryObject. then whenever you need the actual item, you call .get()

Link to comment
Share on other sites

package com.tsurayamiku.hwga.lists;

import com.tsurayamiku.hwga.Main;

import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;

public enum ArmourMaterialList implements IArmorMaterial{
    
    shukuryo("shukuryo", 400, new int[] {8, 10, 9, 7}, 25, ItemList.SHUKURYO.get(), "item.armor.equip_netherite", 10, 10);
    
    private static final int[] max_damage_array = new int[] {13, 15, 16, 11};
    private String name, equipSound;
    private int durability, enchantability, knockbackResistance;
    private Item repairItem;
    private int[] damageReductionAmounts;
    private float toughness;
    
    private ArmourMaterialList(String name, int durability, int[] damageReductionAmounts, int enchantability,
            Item repairItem, String equipSound, float toughness, int knockbackResistance) {
        this.name = name;
        this.durability = durability;
        this.damageReductionAmounts = damageReductionAmounts;
        this.enchantability = enchantability;
        this.equipSound = equipSound;
        this.toughness = toughness;
        this.repairItem = repairItem;
        this.knockbackResistance = knockbackResistance;
    }

    @Override
    public int getDurability(EquipmentSlotType slot) {
        return max_damage_array[slot.getIndex()] * this.durability;
    }

    @Override
    public int getDamageReductionAmount(EquipmentSlotType slot) {
        return this.damageReductionAmounts[slot.getIndex()];
    }

    @Override
    public int getEnchantability() {
        return this.enchantability;
    }

    @Override
    public SoundEvent getSoundEvent() {
        return new SoundEvent(new ResourceLocation(equipSound));
    }

    @Override
    public Ingredient getRepairMaterial() {
        return Ingredient.fromItems(this.repairItem);
    }

    @Override
    public String getName() {
        return Main.MOD_ID + ":" + this.name;
    }

    @Override
    public float getToughness() {
        return this.toughness;
    }

    @Override
    public float getKnockbackResistance() {
        return this.knockbackResistance;
    }
}
 

Edited by Tsurayamiku
mistake
Link to comment
Share on other sites

I changed to Supplier, but got 2 errors: "The return type is incompatible with IArmorMaterial.getRepairMaterial()" and "The method fromItems(IItemProvider...) in the type Ingredient is not applicable for the arguments (Supplier<Item>)"

 

 

package com.tsurayamiku.hwga.lists;

import org.apache.logging.log4j.util.Supplier;

import com.tsurayamiku.hwga.Main;

import net.minecraft.inventory.EquipmentSlotType;
import net.minecraft.item.IArmorMaterial;
import net.minecraft.item.Item;
import net.minecraft.item.crafting.Ingredient;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.SoundEvent;

public enum ArmourMaterialList implements IArmorMaterial{
    
    shukuryo("shukuryo", 400, new int[] {8, 10, 9, 7}, 25, ItemList.SHUKURYO_INGOT.get(), "item.armor.equip_netherite", 10, 10);
    
    private static final int[] max_damage_array = new int[] {13, 15, 16, 11};
    private String name, equipSound;
    private int durability, enchantability, knockbackResistance;
    private Supplier<Item> repairItem;
    private int[] damageReductionAmounts;
    private float toughness;
    
    private ArmourMaterialList(String name, int durability, int[] damageReductionAmounts, int enchantability,
            Item repairItem, String equipSound, float toughness, int knockbackResistance) {
        this.name = name;
        this.durability = durability;
        this.damageReductionAmounts = damageReductionAmounts;
        this.enchantability = enchantability;
        this.equipSound = equipSound;
        this.toughness = toughness;
        this.repairItem = (Supplier<Item>) repairItem;
        this.knockbackResistance = knockbackResistance;
    }

    @Override
    public int getDurability(EquipmentSlotType slot) {
        return max_damage_array[slot.getIndex()] * this.durability;
    }

    @Override
    public int getDamageReductionAmount(EquipmentSlotType slot) {
        return this.damageReductionAmounts[slot.getIndex()];
    }

    @Override
    public int getEnchantability() {
        return this.enchantability;
    }

    @Override
    public SoundEvent getSoundEvent() {
        return new SoundEvent(new ResourceLocation(equipSound));
    }

    @Override
    public Supplier<Ingredient> getRepairMaterial() {
        return (Supplier<Ingredient>) Ingredient.fromItems(this.repairItem);
    }

    @Override
    public String getName() {
        return Main.MOD_ID + ":" + this.name;
    }

    @Override
    public float getToughness() {
        return this.toughness;
    }

    @Override
    public float getKnockbackResistance() {
        return this.knockbackResistance;
    }
}
 

Link to comment
Share on other sites

Well, since you changed your field type from Item to Supplier<Item> you need to make adjustements everywhere that field is used (knowing Java would be very helpful in this case..). Now that you changed repairItem type to Supplier<Item> you can think it like that: now your actual Item object is closed inside a box, which is the Supplier. Everytime you need to get the actual Item object (so the content of the box, not the box) you need to call repairItem.get() ...this open the box so you can retrieve your object

Edited by Beethoven92

Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.