Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

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?

  • Author
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);

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()

  • Author

I'm already using get (). In the part where I must pass the item to be used as repairMaterial I am putting "ItemList.SHUKURYO.get ()", but it is still not working.

  • Author

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

  • Author

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;
    }
}
 

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

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...

Important Information

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

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.