Jump to content

[1.10.2] Help with getStateFromMeta/getMetaFromState


DeadSix27

Recommended Posts

So I have experience in other languages and a little in Java.

But no experience in Forge / Minecraft modding.

 

And I came to an issue I am unable to solve:

 

I worked mostly of the examples made by https://github.com/TheGreyGhost/MinecraftByExample/

 

I nailed my issue down to the overridden functions getStateFromMeta and getMetaFromState.

 

So the issue is:

 

My code crashes with the following stacktrace:

 

net.minecraftforge.fml.common.LoaderExceptionModCrash: Caught exception from Test (testmod)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 18
at net.minecraftforge.fml.common.registry.GameData$BlockCallbacks.onAdd(GameData.java:303)
at net.minecraftforge.fml.common.registry.GameData$BlockCallbacks.onAdd(GameData.java:284)
at net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry.addObjectRaw(FMLControlledNamespacedRegistry.java:584)
at net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry.add(FMLControlledNamespacedRegistry.java:482)
at net.minecraftforge.fml.common.registry.FMLControlledNamespacedRegistry.register(FMLControlledNamespacedRegistry.java:829)
at net.minecraftforge.fml.common.registry.GameData.register_impl(GameData.java:254)
at net.minecraftforge.fml.common.registry.GameRegistry.register(GameRegistry.java:153)

at my.testmod.StartupCommon.preInitCommon(StartupCommon.java:27) <---

 

First problem is, the stacktrace is not detailed enough, all it points me to is:

 

GameRegistry.register(testBlockVariant);

 

Is there a way to get more out of the stacktrace in Java/Forge/Minecraft?

 

But I was able to find what is possibly the cause of the crash, its somewhere in the Meta/State functions.

 

Here is the full BlockTestBlockVariants.java

 

https://gist.github.com/DeadSix27/3f508233175d7e5874ce18aa32698053

 

and StartupCommon.java

 

https://gist.github.com/DeadSix27/2997707637f59db7c81d82ee7c7e5159

 

If you need any more information or files, tell me.

 

 

Link to comment
Share on other sites

So in short the example is wrong?

 

Meaning

 

    @Override
    public int getMetaFromState(IBlockState state)
    {
        EnumFacing facing = (EnumFacing)state.getValue(PROPERTYFACING);
        EnumColour colour = (EnumColour)state.getValue(PROPERTYCOLOUR);

        int facingbits = facing.getHorizontalIndex();
        int colourbits = colour.getMetadata() << 2;
        return facingbits | colourbits;
    }

 

would return a number bigger than 15?

Link to comment
Share on other sites

You have 2 properties: one for the horizontal directions (4 directions) and one for the colors, which are right now 7 values, because you commented out the rest. 4*7=28 possible states, which is more than the 16 values metadata can handle (0-15). If you need more than 16 different values, you have to use another way of storing data, most likely a

TileEntity

.

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

So in short the example is wrong?

 

Meaning

 

    @Override
    public int getMetaFromState(IBlockState state)
    {
        EnumFacing facing = (EnumFacing)state.getValue(PROPERTYFACING);
        EnumColour colour = (EnumColour)state.getValue(PROPERTYCOLOUR);

        int facingbits = facing.getHorizontalIndex();
        int colourbits = colour.getMetadata() << 2;
        return facingbits | colourbits;
    }

 

would return a number bigger than 15?

Yes it would return a bigger value than 15, but the tutorial is not wrong. You used the wrong bit shift "<<" instead of ">>"

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

I figured it has something to do with that, the whole bit code there is a  little beyond my experience, never worked with bitshifting, I will have to read more into that.

 

EDIT: However I should also look at Tile Entities, I guess, I read about people using the tile data for colour and the state for facing, which would allow for a bigger range of colours too.

Link to comment
Share on other sites

Yes it would return a bigger value than 15, but the tutorial is not wrong. You used the wrong bit shift "<<" instead of ">>"

 

What could cause the facing and colour to be wrong upon world load though? I got it working but only until I save and close the world.

 

Then when it loads the world data the states are wrong.

Link to comment
Share on other sites

If you are still using more than 16 metadata values, that's probably what's causing the issue. If you want to have 4 facings, and the full 16 colors, you have 64 different states, which metadata can't handle. You should really use a

TileEntity

for this.

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

BTW, using a TE will not get you away from states and properties. It only serves to truncate the metadata value stored with a block.

 

Another dodge is if one of your properties can be calculated from looking at neighboring blocks (the way walls connect). If for instance your facing depended on neighboring blocks, then it need not be stored in meta.

 

PS: Does vanilla already have a BlockHorizontal class from which you can subclass?

The debugger is a powerful and necessary tool in any IDE, so learn how to use it. You'll be able to tell us more and get better help here if you investigate your runtime problems in the debugger before posting.

Link to comment
Share on other sites

BTW, using a TE will not get you away from states and properties. It only serves to truncate the metadata value stored with a block.

 

Another dodge is if one of your properties can be calculated from looking at neighboring blocks (the way walls connect). If for instance your facing depended on neighboring blocks, then it need not be stored in meta.

 

PS: Does vanilla already have a BlockHorizontal class from which you can subclass?

 

Unfortunately the neighboring blocks idea doesn't work in my case, as for example, it can be on any of the 3 sides in a corner of 3 blocks.

 

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.