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

[1.12.2] Unsure of how to create colour overlay for block.


SeptemberBlue
 Share

Recommended Posts

I can't really figure out what I need to do in order to colour a block. I've seen some methods that return the colour of a block, and I saw the Block class had a recolorBlock method, but I'm still not entirely sure what I'd have to do.

 

EDIT: so to give the block a colour value, I gave it a TileEntity class. Only issue is,

GameRegistry.registerTileEntity()

This appears to be deprecated, so I'm not sure what I'm supposed to replace it with (assuming I should).

Edited by SeptemberBlue
Link to comment
Share on other sites

10 minutes ago, diesieben07 said:

There are two versions of registerTileEntity. Only one is deprecated.

I really do not know how you can miss this, do you not use your IDE?

I see two methods, but both appear with strike through. The first two arguments are the same, but one takes a String and the other takes a Resource Location. Am I supposed to use the one with the latter?

EDIT: Yep, changed the second argument and the method no longer appears with a strike through. Thanks!

 

As for your other comment, the only time I've used my IDE (eclipse) is for when I wanted to work on my minecraft mod. So yeah, I don't know too much about my IDE. I've figured some things out though, so I'm not completely clueless.

Edited by SeptemberBlue
Link to comment
Share on other sites

Ok, so now I have my block that's a TileEntity, and it has its own color variable. There's that, and then I set the TintIndex for some of the faces to 0 for the block model.

 

Is there a method I could use which would add a colour overlay to faces with a TintIndex of 0? Also, if I should use that, what should I use in its place?

Link to comment
Share on other sites

1 hour ago, diesieben07 said:

Subscribe to ColorHandlerEvent.Block and register an IBlockColor instance for your block.

I'm not entirely sure how I'd do this. I see that I have code like this:

	@SubscribeEvent
	public static void onBlockRegister(RegistryEvent.Register<Block> event) {
		event.getRegistry().registerAll(ModBlocks.BLOCKS.toArray(new Block[0]));
	}

So I'm guessing I'd do something similar.

 

Is this on the right track, or do I have this all wrong? Also, anything I should look at to get a better understanding of what you mean?

EDIT: I've found this topic here. I know it's for a later version, but I'm assuming it'll also work for 1.12.2. Looking at their solution there, I have two questions. First off, what does the register method take? I was guessing the variable for the block plus an int for the colour, but that didn't seem to work. Also where can I find the main event bus? Is it that init thing?

 

EDIT 2: IBlockColor doesn't seem to exist. Do I have to create it?

Edited by SeptemberBlue
Link to comment
Share on other sites

54 minutes ago, diesieben07 said:
  • Events are explained in the documentation.
  • You need to subscribe to ColorHandlerEvent.Block, get the BlockColors instance from the event and then register your IBlockColor.
  • Yes, IBlockColor definitely exists, it is in the net.minecraft.client.renderer.color package.

(First off thanks for the documentation!)

 

As for the other two points, I have this so far:

@SubscribeEvent
public static void registerBlockColors(final ColorHandlerEvent.Block event) {
	event.getBlockColors().registerBlockColorHandler(blockColor, ModBlocks.CANVAS);
}

I'm going to replace blockColor. Since IBlockColor is an interface, do I need to make a class that implements it?

Link to comment
Share on other sites

6 hours ago, diesieben07 said:

What are you talking about?

@SideOnly(Side.CLIENT)
public interface IBlockColor
{
    int colorMultiplier(IBlockState state, @Nullable IBlockAccess worldIn, @Nullable BlockPos pos, int tintIndex);
}

The method takes an IBlockState, an IBlockAccess, a BlockPos, and an int. I'm going to set the tintIndex to 0, since that corresponds with the json files. As for the other three, I'm probably going to want the IBlockState, IBlockAccess, and BlockPos for all blocks that need to be coloured (canvas blocks in this case)

Link to comment
Share on other sites

4 minutes ago, SeptemberBlue said:

@SideOnly(Side.CLIENT)
public interface IBlockColor
{
    int colorMultiplier(IBlockState state, @Nullable IBlockAccess worldIn, @Nullable BlockPos pos, int tintIndex);
}

The method takes an IBlockState, an IBlockAccess, a BlockPos, and an int. I'm going to set the tintIndex to 0, since that corresponds with the json files. As for the other three, I'm probably going to want the IBlockState, IBlockAccess, and BlockPos for all blocks that need to be coloured (canvas blocks in this case)

Are you trying to call the method? That's not what you are supposed to do. You need to create an IBlockColor instance and register it.

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

1 minute ago, Animefan8888 said:

Are you trying to call the method? That's not what you are supposed to do. You need to create an IBlockColor instance and register it.

@SubscribeEvent
public static void registerBlockColors(final ColorHandlerEvent.Block event) {
	event.getBlockColors().registerBlockColorHandler(new IBlockColor.colorMultiplier(0,0,0,0), ModBlocks.CANVAS);
}

So how do I register this interface?

Link to comment
Share on other sites

Just now, SeptemberBlue said:

So how do I register this interface?

You need an instance of the interface. If you don't know what that means look it up on google. It's basic Java.

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

Just now, SeptemberBlue said:

How is this not a new instance?

Look it up. This is not a Java forum. Your IDE should be giving you a red underline right underneath that. Which is a clear clue that it is a Java issue.

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

2 minutes ago, Animefan8888 said:

Look it up. This is not a Java forum. Your IDE should be giving you a red underline right underneath that. Which is a clear clue that it is a Java issue.

I'm still not clear which part exactly is wrong.

 

Am I supposed to create a class that implements the interface? Should I give its method the correct arguments? Or is creating an instance not the same as initializing?

Link to comment
Share on other sites

Just now, SeptemberBlue said:

Am I supposed to create a class that implements the interface?

You can definitely do that. Or you can do as diesieben said

11 hours ago, diesieben07 said:

or, since it's a functional interface, you can use a lambda expression.

 

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

Just now, SeptemberBlue said:

I was trying to follow what he said, which would mean that it's not a correct lambda expression. Good to know.

Correct this is what a correct lambda expression looks like.

 

// This way of going about it doesn't require you to use a "return" statement if the method in the interface returns a value.
([PARAMETER NAMES HERE]) -> [SOME CODE WITHIN A SINGLE LINE]

// This way works exactly like you are inside a method.
([PARAMETER NAMES HERE]) -> {
  [MULTILINE CODE HERE]
}

 

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

3 minutes ago, SeptemberBlue said:

How would I access the tag?

If it's in the TileEntity you have access to the IBlockAccess and the BlockPos. You can get the TileEntity and then access your field for the color.

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

1 minute ago, Animefan8888 said:

If it's in the TileEntity you have access to the IBlockAccess and the BlockPos. You can get the TileEntity and then access your field for the color.

Before I attempt any of the above, my TileEntity's color variable is private. Should I make a get method, or should I use some preexisting method?

 

As for what you've said, I'm not entirely sure how to go about it. I see that IBlockAccess has a getTileEntity() method, and that takes a BlockPos. I don't really know how I'm supposed to put those together though. Can I use a lambda expression for IBlockAccess, even if it has other methods?

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 Terms of Use.