Posted July 7, 20205 yr I cannot for the love of me figure out how the new objectregister system works. Been scratching my head at this for a week. Quote The type JemPickaxe does not define JemPickaxe() that is applicable here The above error hi-lites: JemPickaxe::new in the 3rd method. public class JemPickaxes { public static final JemRegistry<Item> PICKAXE = new JemRegistry<>(ForgeRegistries.ITEMS, JemCore.MOD_ID); public static void init() { PICKAXE.register(FMLJavaModLoadingContext.get().getModEventBus()); } public static RegistryObject<Item> OBSIDIAN = PICKAXE.register("obsidian_pickaxe", JemPickaxe::new);; /**public static <OBSIDIAN extends PickaxeItem> OBSIDIAN PickaxeProperties(String item, IItemTier tier, int damage, float speed, Properties properties) *{ * PickaxeProperties("obsidian_pickaxe", ItemTier.NETHERITE, 1, -2.8F, new Item.Properties().group(JemPickaxe.TOOLS)); * * return JemPickaxes.OBSIDIAN = PickaxeProperties("obsidian_pickaxe", ItemTier.NETHERITE, 1, -2.8F, properties); *} * *public static RegistryObject<Item> TEST() *{ * return PICKAXE.register("test_pickaxe", JemPickaxe::new); *} */ } This is what my JemPickaxe class looks like: public class JemPickaxe extends PickaxeItem { public static final ItemGroup TOOLS = new ItemGroup("tools") { @Override public ItemStack createIcon() { return new ItemStack(JemPickaxes.OBSIDIAN.get()); } }; public JemPickaxe(IItemTier tier, int attackDamage, float attackSpeedIn) { super(tier, attackDamage, attackSpeedIn, new Item.Properties().group(TOOLS)); //JemPickaxe.PickaxeProperties(tier, attackDamage, attackSpeedIn, new Item.Properties().group(TOOLS)); } /**public static void PickaxeProperties(String string, ItemTier netherite, int i, float f, Properties group) { * *} * * * public static void OBSIDIAN(IItemTier tier, int attackDamage, float attackSpeedIn) { * super(ItemTier.NETHERITE, 1, -2.8F, new Item.Properties().group(TOOLS)); * JemPickaxe.PickaxeProperties(ItemTier.NETHERITE, 1, -2.8F, new Item.Properties().group(TOOLS)); * } */ } The error only resolves when I remove the parameters from public JemPickaxe(...) so that the brackets are empty and when I change the extend from "Pickaxeitem" to just "Item". Am I completely wrong about how I'm going about this or am I just adding the parameters incorrectly to the new object (Obsidian pickaxe) itself? Edited July 7, 20205 yr by Jemtao
July 7, 20205 yr Author 7 minutes ago, diesieben07 said: Show this class... It's a 1:1 of DeferredRegister.java because after updating from 1.15.2 to 1.16.1 it gave me the error that the particular method called to wasn't accessible because it's been changed to private. Why it suddenly works copied into another class, I don't know. package com.jemmy.core; import net.minecraft.util.ResourceLocation; import net.minecraftforge.event.RegistryEvent; import net.minecraftforge.eventbus.api.EventPriority; import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.RegistryObject; import net.minecraftforge.registries.IForgeRegistry; import net.minecraftforge.registries.IForgeRegistryEntry; import net.minecraftforge.registries.RegistryBuilder; import net.minecraftforge.registries.RegistryManager; import java.util.Collection; import java.util.Collections; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.Objects; import java.util.Set; import java.util.function.Supplier; public class JemRegistry<T extends IForgeRegistryEntry<T>> { public static <B extends IForgeRegistryEntry<B>> JemRegistry<B> create(IForgeRegistry<B> reg, String modid) { return new JemRegistry<B>(reg, modid); } public static <B extends IForgeRegistryEntry<B>> JemRegistry<B> create(Class<B> base, String modid) { return new JemRegistry<B>(base, modid); } private final Class<T> superType; private final String modid; private final Map<RegistryObject<T>, Supplier<? extends T>> entries = new LinkedHashMap<>(); private final Set<RegistryObject<T>> entriesView = Collections.unmodifiableSet(entries.keySet()); private IForgeRegistry<T> type; private Supplier<RegistryBuilder<T>> registryFactory; private boolean seenRegisterEvent = false; private JemRegistry(Class<T> base, String modid) { this.superType = base; this.modid = modid; } public JemRegistry(IForgeRegistry<T> reg, String modid) { this(reg.getRegistrySuperType(), modid); this.type = reg; } @SuppressWarnings("unchecked") public <I extends T> RegistryObject<I> register(final String name, final Supplier<? extends I> sup) { if (seenRegisterEvent) throw new IllegalStateException("Cannot register new entries to DeferredRegister after RegistryEvent.Register has been fired."); Objects.requireNonNull(name); Objects.requireNonNull(sup); final ResourceLocation key = new ResourceLocation(modid, name); RegistryObject<I> ret; if (this.type != null) ret = RegistryObject.of(key, this.type); else if (this.superType != null) ret = RegistryObject.of(key, this.superType, this.modid); else throw new IllegalStateException("Could not create RegistryObject in DeferredRegister"); if (entries.putIfAbsent((RegistryObject<T>) ret, () -> sup.get().setRegistryName(key)) != null) { throw new IllegalArgumentException("Duplicate registration " + name); } return ret; } public Supplier<IForgeRegistry<T>> makeRegistry(final String name, final Supplier<RegistryBuilder<T>> sup) { if (this.superType == null) throw new IllegalStateException("Cannot create a registry without specifying a base type"); if (this.type != null || this.registryFactory != null) throw new IllegalStateException("Cannot create a registry for a type that already exists"); this.registryFactory = () -> sup.get().setName(new ResourceLocation(modid, name)).setType(this.superType); return () -> this.type; } public void register(IEventBus bus) { bus.addListener(this::addEntries); if (this.type == null) { if (this.registryFactory != null) bus.addListener(this::createRegistry); else bus.addListener(EventPriority.LOWEST, this::captureRegistry); } } public Collection<RegistryObject<T>> getEntries() { return entriesView; } private void addEntries(RegistryEvent.Register<?> event) { if (this.type != null && event.getGenericType() == this.type.getRegistrySuperType()) { this.seenRegisterEvent = true; @SuppressWarnings("unchecked") IForgeRegistry<T> reg = (IForgeRegistry<T>)event.getRegistry(); for (Entry<RegistryObject<T>, Supplier<? extends T>> e : entries.entrySet()) { reg.register(e.getValue().get()); e.getKey().updateReference(reg); } } } private void createRegistry(RegistryEvent.NewRegistry event) { this.type = this.registryFactory.get().create(); } private void captureRegistry(RegistryEvent.NewRegistry event) { if (this.superType != null) { this.type = RegistryManager.ACTIVE.getRegistry(this.superType); if (this.type == null) throw new IllegalStateException("Unable to find registry for type " + this.superType.getName() + " for modid \"" + modid + "\" after NewRegistry event"); } else throw new IllegalStateException("Unable to find registry for mod \"" + modid + "\" No lookup criteria specified."); } }
July 7, 20205 yr Author 46 minutes ago, diesieben07 said: Dude... wtf. Use DeferredRegister. Please spend like... 2 minutes trying to find how it changed. The constructor is private now, use the provided factory method. I'm sorry about that,.. but for the last half hour I've been trying to figure out why public static final DeferredRegister<Item> GEMS = new DeferredRegister<>(ForgeRegistries.ITEMS, JemCore.MOD_ID); Doesn't work (as supplied by DeferredRegister). I get: Quote Cannot infer type arguments for DeferredRegister<> I cannot figure out what I'm missing
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.