Tsurayamiku Posted March 29, 2021 Posted March 29, 2021 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? Quote
kiou.23 Posted March 29, 2021 Posted March 29, 2021 when are you calling ItemList.SHUKURYO.get()? Quote
Tsurayamiku Posted March 29, 2021 Author Posted March 29, 2021 On 3/29/2021 at 6:57 PM, kiou.23 said: when are you calling ItemList.SHUKURYO.get()? Expand 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); Quote
kiou.23 Posted March 29, 2021 Posted March 29, 2021 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() Quote
Tsurayamiku Posted March 29, 2021 Author Posted March 29, 2021 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. Quote
Beethoven92 Posted March 29, 2021 Posted March 29, 2021 Show your complete code please Quote Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
Tsurayamiku Posted March 29, 2021 Author Posted March 29, 2021 (edited) 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 March 29, 2021 by Tsurayamiku mistake Quote
Beethoven92 Posted March 29, 2021 Posted March 29, 2021 As kiou23 already said, this needs to be a Supplier: private Item repairItem; Quote Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
Tsurayamiku Posted March 29, 2021 Author Posted March 29, 2021 How do I change the type to Supplier? Quote
Beethoven92 Posted March 29, 2021 Posted March 29, 2021 Supplier<Item> Tough since getRepairMaterial return an Ingredient it would be more correct to define your repairItem field as a Supplier<Ingredient> instead Quote Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
Tsurayamiku Posted March 29, 2021 Author Posted March 29, 2021 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; } } Quote
Beethoven92 Posted March 29, 2021 Posted March 29, 2021 (edited) 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 March 29, 2021 by Beethoven92 Quote Check out the port of the BetterEnd fabric mod (WIP): https://www.curseforge.com/minecraft/mc-mods/betterend-forge-port
Recommended Posts
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.