Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.10.2] Where Should I Register Things???


Jimmeh
 Share

Recommended Posts

Hey there!

 

I'm currently looking through registry events, and I'm confused at which I should be using for what reason. Let's say I've made a custom item. Currently, I have the registration happening in my ClientProxy's PostInit(), being called on the FMLPostInitializationEvent. I was told that I should be doing the registering in a register event. I've come across two different events that seem applicable to me, so I'd like to know the best practice.

 

The first is the RegistryEvent.Register<Item>. The second is ModelRegistryEvent. I'm not too sure which to use. If I had to guess, I'd say just go with the latter, but I want to make sure I follow the best practice. And in that spirit, here's the code I'm using to register my items (in case you'd like to offer some advice here as well. I have those 2 other return statements commented out because my texture isn't being loaded and I'm trying to figure out why). Any help is greatly appreciated :D

 

Code: http://pastebin.com/jSQkPTjM

Link to comment
Share on other sites

Items, blocks, and models need to be registered in PreInit and only PreInit.

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

And you should use

ModelLoader.setCustomModelResourceLocation

instead of

ItemModelMesher#register

(in preInit).

 

For the events, they are new, I haven't seen anybody use it yet.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Link to comment
Share on other sites

Items, blocks, and models need to be registered in PreInit and only PreInit.

No.

We specifically added the 'RegistryEvent.Register<Type>' events to clean up this confusion. Create and register your items/blocks in THIS EVENT ONLY.

 

The ModelRegistryEvent is for registering Models as they are not standard FML controlled registries.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

Okay, thanks guys. The events seemed like a cleaner way to do it, I just wasn't sure what to use since when you register an item, aren't you also registering its model (getItemModelMesher or ModelResourceLocation)? That's also part of what threw me off. But I appreciate all the help so far!

Link to comment
Share on other sites

We specifically added the 'RegistryEvent.Register<Type>' events to clean up this confusion. Create and register your items/blocks in THIS EVENT ONLY.

 

Well thanks for letting the community know, Lex.

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

Items, blocks, and models need to be registered in PreInit and only PreInit.

No.

We specifically added the 'RegistryEvent.Register<Type>' events to clean up this confusion. Create and register your items/blocks in THIS EVENT ONLY.

 

The ModelRegistryEvent is for registering Models as they are not standard FML controlled registries.

 

I know you're the head honcho, but if you have a moment: I created the listener and all is dandy so far. But all I have to do is

event.getRegistry.register(item)

? Or would I also need to still

getItemModelMesher().register()

(or alternatively, as told to me previously in this thread)

ModelLoader.setCustomModelResourceLocation(item, someIntForSomething, new ModelResourceLocation(...)

 

As always, any guidance is greatly appreciated! :D

Link to comment
Share on other sites

If you do custom models you could probably get away with doing it during the Register<Item> event.

Or the ModelRegistryEvent's

 

As I said, the model reigstry isnt a normal registry do it doesnt get its own event, but you could bundle it together with Item. As thats where you're creating your item.

Or if you want, do it in init, it really doesnt matter as long as its after the Register event.

 

 

@Draco, It was publicized when created, it was announced on twitter, it even had a page in our docs, don't get all snippy because you didn't see it.

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

If you do custom models you could probably get away with doing it during the Register<Item> event.

Or the ModelRegistryEvent's

 

As I said, the model reigstry isnt a normal registry do it doesnt get its own event, but you could bundle it together with Item. As thats where you're creating your item.

Or if you want, do it in init, it really doesnt matter as long as its after the Register event.

 

 

@Draco, It was publicized when created, it was announced on twitter, it even had a page in our docs, don't get all snippy because you didn't see it.

 

Okay, thank you! I've moved everything into the Register<Item> event now. I think this is my last question (until I reach the next road bump in the YouTube tutorial series I'm following). I put it in another thread even though I do think it's somewhat related to this. If you could offer a bit of insight there, that'd be great. But either way, I appreciate your time.

 

The other thread (having to do with 'missing' JSON files): http://www.minecraftforge.net/forum/index.php?topic=43043.0

Link to comment
Share on other sites

@Draco, It was publicized when created, it was announced on twitter, it even had a page in our docs, don't get all snippy because you didn't see it.

 

I wasn't actually.

 

But that said, I don't use social media.  It is the worst way to receive info ever conceived.  I mean, yes, if I want information from a specific feed I can go there, but I don't always know I need to go there.

 

As for the docs, do you mean at http://mcforge.readthedocs.io? Because I'm not seeing it currently (then again your post said "had" so maybe it was there and isn't now for...some reason?) Honestly genuinely curious as to where you are referring to so I can read up on how it works.

 

Edit:

it was announced on twitter

Ok, now I'm going to be pedantic and snippy:

There are no tweets from @ForgeDevTeam about this feature.  In fact, of 10 tweets the account has supposedly made, only 6 are even shown, one of which is "first" and another is "What is this "twit" thing?"

 

I'm actually trying to locate the information about this new registration event system and can't.  Heck, even searching these forums for "RegistryEvent" returns 4 threads:

  • This one.
  • A one from a week ago asking what the hell it is for.
  • One from earlier today that I am not reading because the poster providing help is overtly hostile to receiving help himself.
  • Another one from a week ago where someone was having unrelated JSON issues (and their code contained the event).

 

The announcement post in the Releases subsection doesn't show up because it doesn't refer to the event by name, just concept ("new LifeCycle events") with no links to additional information just a "please use this" note.

 

I'm not trying to make your life difficult I'm just bewildered about how I am unable to locate the information you stated as being highly visible.  If I'm looking in the wrong places, then maybe that information needs to be posted to those places.

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

The comments on this are really confusing to me and don't make a lick of sense.

 

Been messing around with forge for months now and I still don't know how to add blocks to the game. Entities and items all day long.

 

Now if I go to learn it or something or go to gather information all the info is going to be wrong because it was changed or something or what?

There is no documentation of how to add blocks, I can't find any.

 

If there was I'd be able to add blocks in my mods, because I would have read the proper way to do it and implemented it right. Instead of half guessing at something, implementing it wrong, then acting like thats ok.

 

wth is going on with the blocks... and how do I make one the *right* way? I'd really like to know myself.

 

Is this video doing it correctly?

 

 

If not I'm not even going to bother with it because its too much crap.

Link to comment
Share on other sites

 

RegistryEvent.Register<Block>

 

That's what I'm not getting.

 

RegistryEvent.Register<Block>?

 

Where exactly would I put this?

@Mod(modid = Reference.MOD_ID, name = Reference.MOD_NAME, version = Reference.MOD_VERSION)
public class Guru
{
@SidedProxy(clientSide = Reference.CLIENT_PROXY_CLASS, serverSide = Reference.SERVER_PROXY_CLASS)
public static CommonProxy proxy;
@Instance(Reference.MOD_ID)
private static Guru instance;
@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
	ModCreativeTabs.load();
	proxy.preInit();
	GuruItems.init();
	GuruItems.register();
	GuruEntities.registerEntities();
	initRecipes();
}
    @EventHandler
    public void init(FMLInitializationEvent event)
    { 
	proxy.registerRenders();
        proxy.registerKeybindings();
        NetworkRegistry.INSTANCE.registerGuiHandler(instance, proxy);
    }	
private static void initRecipes()
{
	GameRegistry.addRecipe(new ItemStack(GuruItems.AIR_ORB), new Object[] {" X ", "X X", " X ", 'X', Items.FEATHER});
	GameRegistry.addRecipe(new ItemStack(GuruItems.WATER_ORB), new Object[] {" X ",  "X X", " X ", 'X', Items.WATER_BUCKET});
	GameRegistry.addRecipe(new ItemStack(GuruItems.EARTH_ORB), new Object[] {" X ",  "X X", " X ", 'X', Item.getItemFromBlock(Blocks.DIRT)});
	GameRegistry.addRecipe(new ItemStack(GuruItems.FIRE_ORB), new Object[] {" X ",  "X X", " X ", 'X', Items.LAVA_BUCKET});
	GameRegistry.addRecipe(new ItemStack(GuruItems.NETHER_ORB), new Object[] {" X ",  "X X", " X ", 'X', Item.getItemFromBlock(Blocks.OBSIDIAN)});
}
public static Guru getInstance()
{
	return instance;
}
}

 

 

 

 

This is how I have my items set up:

public class GuruItems
{
public static Item AIR_ORB;
public static Item WATER_ORB;
public static Item EARTH_ORB;
public static Item FIRE_ORB;
public static Item NETHER_ORB;
public static Item INVISIBLE_ORB;
public static Item CREATIVE_ORB;

public static void init()
{
	Item item = (new ItemBucket(Blocks.AIR)).setUnlocalizedName("bucket").setMaxStackSize(16);
	AIR_ORB = new ItemAirOrb().setUnlocalizedName("air_orb").setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	WATER_ORB = new ItemWaterOrb().setUnlocalizedName("water_orb").setContainerItem(item).setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	EARTH_ORB = new ItemEarthOrb().setUnlocalizedName("earth_orb").setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	FIRE_ORB = new ItemFireOrb().setUnlocalizedName("fire_orb").setContainerItem(item).setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	NETHER_ORB = new ItemNetherOrb().setUnlocalizedName("nether_orb").setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	INVISIBLE_ORB = new ItemInvisibleOrb().setUnlocalizedName("invisible_orb").setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
	CREATIVE_ORB = new ItemCreativeOrb().setUnlocalizedName("creative_orb").setMaxStackSize(64).setCreativeTab(ModCreativeTabs.the_basic_elements);
}
public static void register()
{
	GameRegistry.register(AIR_ORB.setRegistryName ("air_orb"));
	GameRegistry.register(WATER_ORB.setRegistryName ("water_orb"));
	GameRegistry.register(EARTH_ORB.setRegistryName ("earth_orb"));
	GameRegistry.register(FIRE_ORB.setRegistryName ("fire_orb"));
	GameRegistry.register(NETHER_ORB.setRegistryName ("nether_orb"));
	GameRegistry.register(INVISIBLE_ORB.setRegistryName ("invisible_orb"));
	GameRegistry.register(CREATIVE_ORB.setRegistryName ("creative_orb"));
}
public static void registerRenders()
{
	registerRender(AIR_ORB);
	registerRender(WATER_ORB);
	registerRender(EARTH_ORB);
	registerRender(FIRE_ORB);
	registerRender(NETHER_ORB);
	registerRender(INVISIBLE_ORB);
	registerRender(CREATIVE_ORB);
}
private static void registerRender(Item item)
{
	Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));
}
}

Link to comment
Share on other sites

That's what I'm not getting.

 

RegistryEvent.Register<Block>?

 

Where exactly would I put this?

You subscribe to it like a normal event. Note that you will either have to use the new
@EventBusSubscriber

annotation (cleaner) or register your event handler in your mod's constructor, because these events are fired before preInit.

 

private static void registerRender(Item item)

{

Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));

}

}

This is outdated and problematic. You should be registering models using
ModelLoader.setCustomModelResourceLocation

(equivalent to your current method) during

ModelRegistryEvent

.

Link to comment
Share on other sites

That's what I'm not getting.

 

RegistryEvent.Register<Block>?

 

Where exactly would I put this?

You subscribe to it like a normal event. Note that you will either have to use the new
@EventBusSubscriber

annotation (cleaner) or register your event handler in your mod's constructor, because these events are fired before preInit.

 

private static void registerRender(Item item)

{

Minecraft.getMinecraft().getRenderItem().getItemModelMesher().register(item, 0, new ModelResourceLocation(Reference.MOD_ID + ":" + item.getUnlocalizedName().substring(5), "inventory"));

}

}

This is outdated and problematic. You should be registering models using
ModelLoader.setCustomModelResourceLocation

(equivalent to your current method) during

ModelRegistryEvent

.

 

 

There needs to be a friggin guide for this... this is what I'm talking about. Its crap. Like a attending communion of aliens or something. How am I supposed to know if something is outdated if its not deprecated? Clean code is not possible without a way of knowing wth it looks like or knowing that something changed.

Link to comment
Share on other sites

There needs to be a friggin guide for this...
Being worked on already.

 

How am I supposed to know if something is outdated if its not deprecated?
This I agree with, the methods in GameRegistry should be deprecated.

 

 

If it turns out to be in English I'd be happy.

This registry registers registries with `ResourceLocation` names; additionally, it registers registries to `Class` keys. This allows one to look up the registry that registers a certain class (e.g. one can look up `Block.class` in the registry registry with `GameRegistry.findRegistry` to get the registry that registers blocks).

 

^ say that 5 times real fast

Link to comment
Share on other sites

I do Forge for free, however the servers to run it arn't free, so anything is appreciated.
Patreon: http://www.patreon.com/lexmanos
Paypal: http://paypal.me/LexManos

BitCoin: 1Q8rWvUNMM2T1ZfDaFeeYQyVXtYoeT6tTn

Link to comment
Share on other sites

 

That does not make much sense, so I am going to assume that Forge is doing something under the hood.

 

Is there any documentation on how any of this actually works? Learned to read.

 

EDIT: Also, @SideOnly(CLIENT) - is this not "forbidden"?

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

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.