Jump to content

[1.10.2] How to register the block model?


Starless

Recommended Posts

I'm aware this is a really newbie question, but after modding for 1.7.10 for so long the transition is not being kind on me.

 

All this stuff with registry names, json etc is making me crazy, I wish there was a way forge could abstract all that away from modders. I looked at the documentation (which I wish wholeheartedly was more complete), and I found there is nothing on how to register your blocks. With Items, I'm supposed to do this, right?

 

ModelLoader.setCustomModelResourceLocation(item, metadata, model);

 

And all the code I see people just register the block first (in the

GameRegistry

, I mean) and then just grab an item from it using

GameRegistry.findItem(String modid, String registryname)

and then do the above for the item. Is this a hacky way of registering a block texture or is this the right way?

 

If the block has BlockStates, like PropertyDirection which is very common, how is it done.

 

I don't trust tutorials very much, I understand modders have vices and bad coding practices that are frowned upon by the Forge developers. I want to code my mod according to how the Forge team expects their framework to be used, and avoid hacky stuff as much as possible.

 

By the way, if there's a book I can buy, written and/or certified by the Forge team, please let me know.

Link to comment
Share on other sites

Block models are handled by the state mapper (

IStateMapper

), by default

DefaultStateMapper

is used, which turns the blockstate properties into a variant string.

 

For inventory models (blocks don't exist in inventories or dropped form, only items can, that's why

ItemBlock

exists) it works the same as for normal items: You call

ModelLoader.setCustomModelResourceLocation

.

Item.getItemFromBlock

can be used to obtain the

ItemBlock

for block, if there is one.

 

Thank you very much for answering.

 

I see. So what seems hacky is a way of registering the block and it is an ItemBlock. But how to register the block in world model? Please could you give me an example of a block with no BlockStates, and a block with directional block states?

Link to comment
Share on other sites

So, this is the way to register a block with no properties?

 

       

       @SideOnly(Side.CLIENT)
private static void registerRender(Block block)
{
	Item item = Item.REGISTRY.getObject(block.getRegistryName());
	ModelLoader.setCustomModelResourceLocation(item, 0, new  ModelResourceLocation(item.getRegistryName(), "inventory"));

	ModelLoader.setCustomStateMapper(block, new DefaultStateMapper());
}

 

and then I have to create this json in my blockstates folder:

 

{
    "forge_marker": 1,
    "defaults": {
        "textures": {
            "all": "modid:blocks/texture_name"
        }
    },
    "variants": {
        "normal": {
            "model": "cube_all"
        },
        "inventory": {
            "model": "cube_all"
        }
    }
}

 

and this one in my models.block:

 

{
    "parent": "block/cube_all",
    "textures": {
        "all": "modid:blocks/texture_name"
    }
}

 

and if my block had a property of type PropertyDirection like this

 

public class MyBlock extends Block
{
public static final PropertyDirection facing = PropertyDirection.create("facing", EnumFacing.Plane.HORIZONTAL);

}

 

and if it had a texture for each side, what would the registration and json look like?             

Link to comment
Share on other sites

This is not needed, the

DefaultStateMapper

is automatically used if you don't specify.

So I pass null as the second argument of

ModelLoader.setCustomStateMapper

, or I don't invoke it at all?

 

Not quite. In your blockstate json you say to use block/cube_all as the model, meaning it will not care about your json models. This is fine, you don't need them, you can specify the texture in the blockstate json as well, then you don't need a model file at all.

What you're saying is, since I have texture and cube_all for both normal and inventory I don't need a json file for the block model, just this one for the BlockState suffices.

 

The registration would look the same. In the blockstate json you would have to specify variants "facing=north", "facing=east" and so on to specify every direction.

could you please link/write me an example of a json file that does that? Writing a json file on my own for an unknown schema is not possible. If I had an example I would get the gist of the schema and then I'd be able to write other files myself, and my questions will be less broad and more specific (I hope).

Link to comment
Share on other sites

Vanilla contains plenty of examples, look at furnace.json for example.

 

So this will sound stupid. but where can I find that file? The one that gets exposed in eclipse as part of minecraft's source code won't open. I guess because whatever translates .class back to java doesn't care about .json. Is there a location in my file system where I can find those files?

 

And one last question, is it just me or this whole blockstate and models and json files is a lot (A LOT) harder to deal with than the old metadata?

Link to comment
Share on other sites

Ctrl-Shift-R in eclipse, Ctrl-Shift-N in IntelliJ to navigate to a file.

 

Oh. No, I see the file, I can navigate to its location (

ReferencedLibraries/forgeSrc[...]/assets/minecraft/blockstates/furnace.json

; I can do the same thing for the model file). It just won't open. It's not an actual "file". It's probably part of a saved stream that never got translated back to json. If I right click it, the option Show In -> System Explorer is disabled. This file that eclipse is showing doesn't seem to exist in my file system. I assume another version of the file may exist elsewhere.

 

see the images bellow:

 

 

 

f6hYYdd.png

JdNQeCn.png

 

 

Link to comment
Share on other sites

I guess there is never an end to eclipse's shortcomings, apparently the thing cannot search for files in libraries...

So, Go to Referenced Libraries > forgeSrc-<version> and navigate to the json manually. Then you have to tell eclipse to open JSON files in the default text editor: Window > Preferences > General > Editors > File Associations > Add a file type "*.json", then add "Text Editor" as the Associated Editor in the field below.

 

What a great IDE.

 

Thank you very much! that worked. By the way, I'm using eclipse Mars for modding, because with the new version, Neon, the

gradlew setupDecompWorkspace

and

gradlew eclipse

would not result in a nice workspace with everything ready and our example mod there. No. After doing all that, Neon opens an empty workbench, with no project loaded, nothing. Just a welcome page.

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.