Jump to content

How can I add multiple rotated blocks onto a single metadata block?


Recommended Posts

Posted

Hey guys.

 

The main thing I'm struggling with in this is how to phrase my onBlockPlacedBy method.

Right now, I have a single block in here, using 4 metadata- one for each of the four directions it can face:

 

    public void onBlockPlacedBy(World par1World, int par2, int par3, int par4, EntityLivingBase par5EntityLivingBase, ItemStack par6ItemStack)
    {
        int l = MathHelper.floor_double((double)(par5EntityLivingBase.rotationYaw * 4.0F / 360.0F) + 2.5D) & 3;
        par1World.setBlockMetadataWithNotify(par2, par3, par4, l, 2);

	if (l == 0) {
		par1World.setBlockMetadataWithNotify(par2, par3, par4, 0, 0);
	}

	if (l == 1) {
		par1World.setBlockMetadataWithNotify(par2, par3, par4, 1, 0);
	}

	if (l == 2) {
		par1World.setBlockMetadataWithNotify(par2, par3, par4, 2, 0);
	}

	if (l == 3) {
		par1World.setBlockMetadataWithNotify(par2, par3, par4, 3, 0);
	}
}	

 

This then gets read by the Renderer (It's a modelled block), Like so:

 

@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale) {
	int i = te.getBlockMetadata();
	int meta = 180;

	if (i == 0) {
		meta = 0;
	}

	if (i == 3) {
		meta = 90;
	}

	if (i == 2) {
		meta = 180;
	}

	if (i == 1) {
		meta = 270;
	}

 

Now, the renderer part I can easily change to read different metas, and set the various metadatas to one of the four directions.

 

What I can't quite work out, is how I can seperately define the four different blocks in my onBlockPlacedBy, and then set the meta depending on each of their directions. Does that make sense at all? :P

 

Can anyone point me in the right direction? (No pun intended)

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Posted

Are you after a setup like this?

 

meta 0 = block 1 north

meta 1 = block 1 south

meta 2 = block 1 east

meta 3 = block 1 west

 

meta 4 = block 2 north

meta 5 = block 2 south

meta 6 = block 2 east

meta 7 = block 2 west

 

meta 8 = block 3 north

meta 9 = block 3 south

meta 10 = block 3 east

meta 11 = block 3 west

 

meta 12 = block 4 north

meta 13 = block 4 south

meta 14 = block 4 east

meta 15 = block 4 west

Posted

Are you after a setup like this?

 

meta 0 = block 1 north

meta 1 = block 1 south

meta 2 = block 1 east

meta 3 = block 1 west

 

meta 4 = block 2 north

meta 5 = block 2 south

meta 6 = block 2 east

meta 7 = block 2 west

 

meta 8 = block 3 north

meta 9 = block 3 south

meta 10 = block 3 east

meta 11 = block 3 west

 

meta 12 = block 4 north

meta 13 = block 4 south

meta 14 = block 4 east

meta 15 = block 4 west

 

Yeah, that's exactly what I want. But if I try and do something along the lines of:

if (l == 0 && meta == 1) {

par1World.setBlockMetadataWithNotify(par2, par3, par4, 0, 0);

}

                //(and so on)

 

It breaks my render code altogether. :(

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Posted

Give this a go.

 

@Override
public void onBlockPlacedBy(World world, int x, int y, int z, EntityLivingBase entityliving, ItemStack itemStack)
{
    int blockSet = world.getBlockMetadata(x, y, z) / 4;
    int direction = MathHelper.floor_double((entityliving.rotationYaw * 4F) / 360F + 0.5D) & 3;
    int newMeta = (blockSet * 4) + direction;
    world.setBlockMetadataWithNotify(x, y, z, newMeta, 0);
}

 

 

@Override
public void renderTileEntityAt(TileEntity te, double x, double y, double z, float scale)
{
    int rotation = 180;
    switch(te.getBlockMetadata() % 4) {
        case 0:
            rotation = 0;
            break;
        case 3:
            rotation = 90;
            break;
        case 2:
            rotation = 180;
            break;
        case 1:
            rotation = 270;
            break;
    }

    String texture = "textures/entities/atm.png";
    switch(te.getBlockMetadata() / 4) {
        case 0:
            texture = "blockset1";
            break;
        case 1:
            texture = "blockset2";
            break;
        case 2:
            texture = "blockset3";
            break;
        case 3:
            texture = "blockset4";
            break;
    }

    Minecraft.getMinecraft().renderEngine.func_110577_a(new ResourceLocation("flenixcities", texture));

    // rest of your renderer
}

 

Posted

@Override
public void getSubBlocks(int id, CreativeTabs tab, List list)
{
    list.add(new ItemStack(this, 1, 0));
    list.add(new ItemStack(this, 1, 4));
    list.add(new ItemStack(this, 1, );
    list.add(new ItemStack(this, 1, 12));
}

 

 

You already have a tile entity, you can do everything without touching meta.

 

you could store the rotation in the tileentity and use the metas for 16 atms  (limits you to 16 atms)

or put the atm in the tile entity and use meta 0-3 for rotation (limit is based on variable type, go ahead an fill an int ;) )

or put both type and rotation in the tile freeing up the meta for other stuff.

 

RedPower has its microblocks in one id due to heave tileentity usage.

Posted

I posted about doing that before, but no one could tell me how Redpower does it :P It'd be a huge bonus for me; the mod I'm working on here will have hundreds of modelled blocks, many of which are purely decorational or have very simple functions, so I could really cut down on IDs by using the tile entities :P

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Posted

Redpower does some really heavy stuff with TileEntitys. I don't know how you can implement that in your mod, but if it's possible (I know that it's possible) and you figured it out, can you please post the code or point me to the right direction, cause that could really help my mod to use way less IDs than it now has...

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/

Posted

Redpower does some really heavy stuff with TileEntitys. I don't know how you can implement that in your mod, but if it's possible (I know that it's possible) and you figured it out, can you please post the code or point me to the right direction, cause that could really help my mod to use way less IDs than it now has...

 

Just took a look at your mod. Are you using TileEntites for the roads, or just future planned stuff?

If it's for the roads, I wouldn't recommend it. I tried it briefly in my FlenixRoads mod, but they de-render after a certain distance so I changed how I made them and ended up using more IDs than planned :P

width=463 height=200

http://s13.postimg.org/z9mlly2av/siglogo.png[/img]

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Posted

Redpower does some really heavy stuff with TileEntitys. I don't know how you can implement that in your mod, but if it's possible (I know that it's possible) and you figured it out, can you please post the code or point me to the right direction, cause that could really help my mod to use way less IDs than it now has...

 

Just took a look at your mod. Are you using TileEntites for the roads, or just future planned stuff?

If it's for the roads, I wouldn't recommend it. I tried it briefly in my FlenixRoads mod, but they de-render after a certain distance so I changed how I made them and ended up using more IDs than planned :P

 

I'm currently not using tile entitys for my road blocks, but I  think that there about 8 different blocks but with different directions. If I know how to use TileEntitys for the blocks (like Redpower does) I would be able to add more road blocks in a single id instead with more ids

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/

Posted

You could try workign with NBT data. Similar to Tile Entities, items(which includes ItemBlocks) can store info as NBT data. You'd have to tap into the function that causes the block to drop and override it so it drops a custom ItemStack which then has a NBTTagCompound assigned to it containing necessary information. That's how ThermalExpansion, for instance, stores the charge and settings on Energy Cells and Tesseracts. With that, everything, including textures for the block can be done via the TileEntity and saved within the NBT of the dropped item, to be later recalled when the block is placed / the TileEntity is initialized.

Posted

Well to be more precise its not infinite, but you can put a lot of similar blocks into one id.

 

Your extended meta is an integer this provides a very large meta range (-2,147,483,648 to 2,147,483,647)

as most will never need that many you can reduce the save size by switching to short (-32,768 to 32,767) or a byte (-128 to 127)

 

and if used in combination with the normal base meta you can times that by 16

 

You will run into a few limitations though

Not all functions are location aware.

In most cases they are at least meta aware, but sometimes they are not (this is rare though)

So best to keep similar blocks in one id and very similar ones in the same base meta

 

Damage value of the item is limited to an integer (I think positive only too)

So you can not have each extended meta have it own item, but you could have a stair like object using 8 extended metas and uses 1 item damage value.

Posted

So how would I implement that in my mod? Just let all the blocks I want to have in 1 ID create a new TileEntityExtendedMeta instance?

 

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/

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.