Jump to content

Recommended Posts

Posted (edited)

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 by Jemtao
Posted
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.");
    }
}

 

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

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.