Jump to content

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


SeptemberBlue

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

7 minutes ago, SeptemberBlue said:

Should I make a get method,

This is what you should do. There is no pre-existing method.

 

7 minutes ago, SeptemberBlue said:

Can I use a lambda expression for IBlockAccess, even if it has other methods?

You don't really know what a lambda expression is. Go read up on them seriously, they are greatly useful.

 

8 minutes ago, SeptemberBlue said:

I don't really know how I'm supposed to put those together though.

Do you know how to call a method?

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

14 minutes ago, Animefan8888 said:

This is what you should do. There is no pre-existing method.

Done.

14 minutes ago, Animefan8888 said:

You don't really know what a lambda expression is. Go read up on them seriously, they are greatly useful.

My basic understanding of them so far is that you give them the parameters of a function, and then on the other side give it a return value. Will read up on them more though.

14 minutes ago, Animefan8888 said:

Do you know how to call a method?

@Nullable
TileEntity getTileEntity(BlockPos pos);

Not when it looks like this (from IBlockAccess).

 

EDIT: DAMMIT, never thought to use the arguments from the method. I might be able to solve my own problem here.

Edited by SeptemberBlue
Link to comment
Share on other sites

Alright, it seems to be picking the color of the block, which is good. What's weird though is that I can't change the color. I've used blockdata to try change the color value to something else, but when I check the block again, the color value reset.

 

the class:

public class TileEntityCanvas extends TileEntity {
	private int color;
	
	public TileEntityCanvas() {
	}
	
	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound compound) {
		super.writeToNBT(compound);
		compound.setInteger("color", color);
		return compound;
	}
	
	@Override
	public void readFromNBT(NBTTagCompound compound) {
		super.readFromNBT(compound);
	}
	
	public int getColor() {
		return color;
	}
	
	public void setColor (int c) {
		color=c;
	}
}

EDIT: Pretty sure this has to do with the writeToNBT, will add an if statement to check if the "color" value changed. Looking for a method that gets an NBT value.

 

EDIT 2:

	@Override
	public NBTTagCompound writeToNBT(NBTTagCompound compound) {
		super.writeToNBT(compound);
		if (!compound.hasKey("color") || compound.getInteger("color") != color) compound.setInteger("color", color);
		return compound;
	}

For some reason, the color variable still won't change.

Edited by SeptemberBlue
Link to comment
Share on other sites

16 minutes ago, SeptemberBlue said:

Is there some way I can call the event every time the color gets updated?

No that won't do anything.

 

16 minutes ago, SeptemberBlue said:

but the block does not actually change colour.

The Block has a model which is built into a mesh which is rendered. The mesh is not updated until a block in the world changes. Hence it doesn't update dynamically. You need to add a dummy BooleanProperty to your BlockState. And switch between those when the color is changed.

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, Animefan8888 said:

You need to add a dummy BooleanProperty to your BlockState.

So wait, do I add that to my BlockState json?

 

3 minutes ago, Animefan8888 said:

No that won't do anything. 

How would that not do anything? I was thinking I'd add an if statement to the readNBT part that checks if the colour changed, and if it did, call the event to change accordingly. Or are you saying that if I did try to call the event, nothing would happen?

Edited by SeptemberBlue
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.