Jump to content

RegistryEvents issue


LuccaPossamai

Recommended Posts

I'm trying create an item that holds an entity(like an "SpawnEggItem"). But when I try to register the item with an created entity, this entity wasn't been registered yet. There's a priority system to these events? This is my code btw:

Spoiler

public class Registration {

    public static final DeferredRegister<EntityType<?>> ENTITIES = create(ForgeRegistries.ENTITIES);
    public static final DeferredRegister<Item> ITENS = create(ForgeRegistries.ITEMS);


    public static void register(){
        IEventBus fml = FMLJavaModLoadingContext.get().getModEventBus();
        ENTITIES.register(fml);
        ITENS.register(fml);

        ModEntities.register();
        ModItens.register();
    }

    private static <T extends IForgeRegistryEntry<T>> DeferredRegister<T> create(IForgeRegistry<T> registry){
        return DeferredRegister.create(registry, ExampleMod.MOD_ID);
    }

}

 

 

Link to comment
Share on other sites

None of the code you've shown here is registering an item.

 

I also don't know why you wrapped DeferredRegister.create in a function with a convoluted signature rather than just going ENTITIES = DeferredRegister.create(ForgeRegistries.ENTITIES);

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Here it is the part of the code, the Item:
 

Spoiler

public class ModItens {

  static void register(){ }

  public static Item.Properties getEssenceProperties(){
        return new Item.Properties()
                .tab(ModItemGroups.ESSENCE_TAB)
                .stacksTo(1);
    }
    
    public static final RegistryObject<Item> ESSENCE_PILLAGER_GOLD = Registration.ITENS.register("essence_entity.minecraft.golden_armoured_pillager", () ->
            new Essence(getEssenceProperties(), ModEntities.GOLDEN_ARMOURED_PILLAGER.get(), 5451574, 16167425));

    public static final RegistryObject<Item> ESSENCE_PILLAGER_DIAMOND = Registration.ITENS.register("essence_entity.minecraft.diamond_armoured_pillager", () ->
            new Essence(getEssenceProperties(), ModEntities.DIAMOND_ARMOURED_PILLAGER.get(), 5451574, 9433559));
  
}

 

and the entities' :

Spoiler

public class ModEntities {

    static void register(){
        System.out.println("Registering EntityTypes");
    }

    public static final RegistryObject<EntityType<GoldenArmouredPillager>> GOLDEN_ARMOURED_PILLAGER = Registration.ENTITIES.register("golden_armoured_pillager", () ->
            EntityType.Builder.<GoldenArmouredPillager>of(
                    GoldenArmouredPillager::new,
                    EntityClassification.CREATURE)
                    .canSpawnFarFromPlayer()
                    .sized(0.6F, 1.95F)
                    .clientTrackingRange(8).build("golden_armoured_pillager"));

    public static final RegistryObject<EntityType<DiamondArmouredPillager>> DIAMOND_ARMOURED_PILLAGER = Registration.ENTITIES.register("diamond_armoured_pillager", () ->
            EntityType.Builder.<DiamondArmouredPillager>of(
                    DiamondArmouredPillager::new,
                    EntityClassification.CREATURE)
                    .canSpawnFarFromPlayer()
                    .sized(0.6F, 1.95F)
                    .clientTrackingRange(8).build("diamond_armoured_pillager"));
}

 

 

Link to comment
Share on other sites

16 minutes ago, LuccaPossamai said:

new Essence

...and this class?

 

Also, you know it's spelled "items" with an M right?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

I'm from Brazil, and I'm used to code in portuguese. Like "items" in english is "itens" in portguese. Here it is the Essence class, and the EssenceItem class. I created 2 different classes to separete and simplify some things. 

Spoiler

public class Essence extends EssenceItem {

    public Essence(Properties properties, @Nullable EntityType tipo, int color1, int color2) {
        super(properties, tipo, color1, color2);

    }

    @Override
    public ActionResultType useOn(ItemUseContext p_195939_1_) {
        return ActionResultType.FAIL;
    }


}

 

Spoiler

public class EssenceItem extends Item {

    private static final Map<EntityType<?>, EssenceItem> BY_ID = Maps.newIdentityHashMap();
    private final int color1;
    private final int color2;
    private final EntityType<?> defaultType;

    public EssenceItem(Properties properties, @Nullable EntityType tipo, int color1, int color2) {
        super(properties);
        this.defaultType = tipo;
        this.color1 = color1;
        this.color2 = color2;
        BY_ID.put(tipo, this);

    }

    @OnlyIn(Dist.CLIENT)
    public int getColor(int p_195983_1_) {
        return p_195983_1_ == 0 ? this.color1 : this.color2;
    }

    @Nullable
    @OnlyIn(Dist.CLIENT)
    public static Item byId(@Nullable EntityType<?> p_200889_0_) {
        return BY_ID.get(p_200889_0_);
    }

    public static Iterable<EssenceItem> essences() {
        return Iterables.unmodifiableIterable(BY_ID.values());
    }

    public EntityType<?> getType(@Nullable CompoundNBT p_208076_1_) {
        if (p_208076_1_ != null && p_208076_1_.contains("EntityTag", 10)) {
            CompoundNBT compoundnbt = p_208076_1_.getCompound("EntityTag");
            if (compoundnbt.contains("id", 8)) {
                return EntityType.byString(compoundnbt.getString("id")).orElse(this.defaultType);
            }
        }

        return this.defaultType;
    }

}

 

 

Link to comment
Share on other sites

(1) do not use OnlyIn pretty much ever, and never on methods you are creating whole cloth.

(2) your getType method is never called

(3) your useOn method does a whole lotta nuthin

(4) have you looked at the vanilla spawn egg?

(5) why are you not extending the vanilla spawn egg?

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

25 minutes ago, LuccaPossamai said:

These things you've said interferes in the problem?

the 3 first no, not really. but you should fix them
the last 2 should point you torwards the general direction of how to solve your problem

 

but here is the thing when using RegistryObjects: you can call .get() on static initialization (so since your items are statically initialized, you can't call any RegistryObject#get() in their definition). that's because at static initialization, the RegistryObjects haven't been populated yet, you need to wait until setup to be able to call .get()

so the way to work around this, is to just pass the RegistryObject itself (or any other supplier, the RegistryObject is just a fancy supplier). so then the entity won't try to be unpacked when it doesn't exist yet (i.e.: static initialization), and you unpack the Entity registry object whenever you actually need it.

 

Also, if you look at the vanilla spawn egg, you won't see this that I'm talking about, because vanilla doesn't use RegistryObjects

Link to comment
Share on other sites

Oh, also:

5 hours ago, diesieben07 said:

First of all the BLOCKS and ITEMS fields (i.e. your DeferredRegister instances) should not be in a separate class. Put them in the same class or you will have issues.

Because you didn't do this, you had to do this:

Quote

ModEntities.register();
ModItens.register();

And call empty methods.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

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.