Jump to content
View in the app

A better way to browse. Learn more.

Forge Forums

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Featured Replies

Posted

Hi!

 

I wanted to add a few custom signs to my mod so I looked a little at the default code and tried to create them as I normally do.


    public static void init() {
public static Block spruce_standing_sign;
public static Block spruce_wall_sign;

    }
    public static void register() {
spruce_standing_sign = new BlockStandingSign().setUnlocalizedName("spruce_standing_sign");
spruce_wall_sign = new BlockWallSign().setUnlocalizedName("spruce_wall_sign");
    }

 

Since the BlockStandingSign and BlockWallSign were public and I didn't need to change anything in them I didn't create my own blockclasses for them. The only thing I changed was ItemSign were I overrode the "onItemUse" method so it would place my custom sign.

@Override
public boolean onItemUse(ItemStack stack, EntityPlayer playerIn, World worldIn, BlockPos pos, EnumFacing side, float hitX, float hitY, float hitZ)
{
	if (side == EnumFacing.DOWN)
	{
		return false;
	}
	else if (!worldIn.getBlockState(pos).getBlock().getMaterial().isSolid())
	{
		return false;
	}
	else
	{
		pos = pos.offset(side);

		if (!playerIn.canPlayerEdit(pos, side, stack))
		{
			return false;
		}
		else if (!Blocks.standing_sign.canPlaceBlockAt(worldIn, pos))
		{
			return false;
		}
		else if (worldIn.isRemote)
		{
			return true;
		}
		else
		{
			if (side == EnumFacing.UP)
			{
				int i = MathHelper.floor_double((double)((playerIn.rotationYaw + 180.0F) * 16.0F / 360.0F) + 0.5D) & 15;
				worldIn.setBlockState(pos, SBMBlocks.spruce_standing_sign.getDefaultState().withProperty(BlockStandingSign.ROTATION, Integer.valueOf(i)), 3);
			}
			else
			{
				worldIn.setBlockState(pos, SBMBlocks.spruce_wall_sign.getDefaultState().withProperty(BlockWallSign.FACING, side), 3);
			}

			--stack.stackSize;
			TileEntity tileentity = worldIn.getTileEntity(pos);

			if (tileentity instanceof TileEntitySign && !ItemBlock.setTileEntityNBT(worldIn, playerIn, pos, stack))
			{
				playerIn.openEditSign((TileEntitySign)tileentity);
			}

			return true;
		}
	}
}

}

This worked great on walls but when I tried to place a standing sign it had the right hitbox, was the right block according to F3 but it had no pole and wasn't rotated properly. Basically it was a floating wallsign. I cannot figure out what's wrong as I have not changed anything except the item which I have checked countless times. I'm a beginner though so it might just be some silly mistake I have missed.

 

Oh and also, how would I go about adding a custom texture to it? Signs don't seem to have models.

Signs are rendered by

TileEntitySignRenderer

, this only renders a standing sign if the

Block

is

Blocks.standing_sign

.

 

I suggest adapting the rendering code from this class into your own

TESR

that uses

instanceof

to check whether the sign is standing or not and uses your own texture. Use

ClientRegistry.bindTileEntitySpecialRenderer

from your client proxy to register the

TESR

.

 

You'll need to create your own

TileEntity

class that extends

TileEntitySign

and

Block

classes that extend

BlockWallSign

/

BlockStandingSign

and override

Block#createTileEntity(World, IBlockState)

to create your

TileEntity

instead of

TileEntitySign

.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

  • Author

Signs are rendered by

TileEntitySignRenderer

, this only renders a standing sign if the

Block

is

Blocks.standing_sign

.

 

I suggest adapting the rendering code from this class into your own

TESR

that uses

instanceof

to check whether the sign is standing or not and uses your own texture. Use

ClientRegistry.bindTileEntitySpecialRenderer

from your client proxy to register the

TESR

.

 

You'll need to create your own

TileEntity

class that extends

TileEntitySign

and

Block

classes that extend

BlockWallSign

/

BlockStandingSign

and override

Block#createTileEntity(World, IBlockState)

to create your

TileEntity

instead of

TileEntitySign

.

 

That seems to have done it, thanks! :D Now my only problem is that the particle effects from breaking the block are pink and black. Since the signs don't have a blockmodel I'm not sure how to change that.

  • Author

Signs are rendered by

TileEntitySignRenderer

, this only renders a standing sign if the

Block

is

Blocks.standing_sign

.

 

I suggest adapting the rendering code from this class into your own

TESR

that uses

instanceof

to check whether the sign is standing or not and uses your own texture. Use

ClientRegistry.bindTileEntitySpecialRenderer

from your client proxy to register the

TESR

.

 

You'll need to create your own

TileEntity

class that extends

TileEntitySign

and

Block

classes that extend

BlockWallSign

/

BlockStandingSign

and override

Block#createTileEntity(World, IBlockState)

to create your

TileEntity

instead of

TileEntitySign

.

 

That seems to have done it, thanks! :D Now my only problem is that the particle effects from breaking the block are pink and black. Since the signs don't have a blockmodel I'm not sure how to change that.

 

I actually noticed right now that the text on the sign doesn't save when i exit the world, the log says:

[19:18:04] [server thread/ERROR] [FML]: A TileEntity type nu.aksberg.sbm.tileentity.TileEntitySpruceSign has throw an exception trying to write state. It will not persist. Report this to the mod author
java.lang.RuntimeException: class nu.aksberg.sbm.tileentity.TileEntitySpruceSign is missing a mapping! This is a bug!

What's that all about? ???

That seems to have done it, thanks! :D Now my only problem is that the particle effects from breaking the block are pink and black. Since the signs don't have a blockmodel I'm not sure how to change that.

 

It looks like Minecraft hardcodes the textures for its blocks that don't use a standard model (e.g. signs, liquids). You can probably create a dummy JSON model and specify its

"particle"

texture. You'll need a blockstates file that tells Minecraft to use the model (which won't actually be rendered) and an

IStateMapper

that ignores the state and always maps to the same variant of the blockstates file.

 

I actually noticed right now that the text on the sign doesn't save when i exit the world, the log says:

[19:18:04] [server thread/ERROR] [FML]: A TileEntity type nu.aksberg.sbm.tileentity.TileEntitySpruceSign has throw an exception trying to write state. It will not persist. Report this to the mod author
java.lang.RuntimeException: class nu.aksberg.sbm.tileentity.TileEntitySpruceSign is missing a mapping! This is a bug!

What's that all about? ???

 

Every

TileEntity

you add must be registered using

GameRegister.registerTileEntity

. Make sure you include your mod ID in the

TileEntity

's ID so you don't conflict with other mods.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

  • Author

It looks like Minecraft hardcodes the textures for its blocks that don't use a standard model (e.g. signs, liquids). You can probably create a dummy JSON model and specify its

"particle"

texture. You'll need a blockstates file that tells Minecraft to use the model (which won't actually be rendered) and an

IStateMapper

that ignores the state and always maps to the same variant of the blockstates file.

I have made a model file called spruce_sign.json:

{
    "parent": "block/cube_all",
    "textures": {
        "particle": "blocks/planks_spruce"
    }
}

and a blockstate also called spruce_sign.json:

{
    "variants": {
        "normal": { "model": "sbm:spruce_sign" }
    }
}

but I don't quite understand how to use

IStateMapper

. Could you explain in a little more detail?

but I don't quite understand how to use

IStateMapper

. Could you explain in a little more detail?

 

Create an anonymous class that extends

StateMapperBase

and override the

getModelResourceLocation

method to return a

ModelResourceLocation

pointing to the variant in your blockstates file. In this case, use the

ModelResourceLocation(String resourceName, String variant)

constructor with

"sbm:spruce_sign"

as the resource name (i.e. assets/sbm/blockstates/spruce_sign.json)  and

"normal"

as the variant.

 

Call

ModelLoader.setCustomStateMapper

from your client proxy in preInit with your

Block

as the first argument and this anonymous class as the second argument.

 

I do something similar for my fluid blocks here.

Please don't PM me to ask for help. Asking your question in a public thread preserves it for people who are having the same problem in the future.

  • Author

but I don't quite understand how to use

IStateMapper

. Could you explain in a little more detail?

 

Create an anonymous class that extends

StateMapperBase

and override the

getModelResourceLocation

method to return a

ModelResourceLocation

pointing to the variant in your blockstates file. In this case, use the

ModelResourceLocation(String resourceName, String variant)

constructor with

"sbm:spruce_sign"

as the resource name (i.e. assets/sbm/blockstates/spruce_sign.json)  and

"normal"

as the variant.

 

Call

ModelLoader.setCustomStateMapper

from your client proxy in preInit with your

Block

as the first argument and this anonymous class as the second argument.

 

I do something similar for my fluid blocks here.

 

Okay, everything seems to work now! :D Thanks a bunch for all the help, I wouldn't have been able to do this without it.

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

Important Information

By using this site, you agree to our Terms of Use.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.