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

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


Flenix
 Share

Recommended Posts

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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
}

 

Link to comment
Share on other sites

Worked perfectly. Now I just gotta figure out how to restrict creative tabs to just the four meta so I don't have all the rotations in there :P This will save me on a lot of IDs though, especially if I can figure out how to change the model with meta too.

 

Thanks :D

 

51da7da38ff84.jpg

width=463 height=200

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

My mods (Links coming soon)

Cities | Roads | Remula | SilvaniaMod | MoreStats

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

So if I use that, I can have infinite blocks in 1 ID like Redpower does?

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

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.

Link to comment
Share on other sites

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/

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I want to play minecraft modded with CurseForge but every time i start my mincraft its crash with the report:  This crash may be caused by an invalid java runtime configuration. Check any custom configuration settings. Exite Code:1 and i dont now what it mean i already reinstalled minecraft and curseforge i dont have mods loaded or installed when i start the game. i just start forge 1.18.2 but its crash. This is the Game output: 17:01:53.866 launcher main Preparing to launch minecraft client for forge-40.1.0 17:01:53.867 launcher main Prepared asset index 17:01:54.226 launcher main Have 3120 total files to check or download 17:01:54.235 launcher main Local file C:\Users\User\curseforge\minecraft\Install\versions\forge-40.1.0\forge-40.1.0.jar is incomplete 17:01:55.968 launcher main Minecraft client forge-40.1.0 requires 1521781 bytes to download. 17:01:55.968 launcher main Starting! 17:01:55.968 launcher main Downloading 1 files 17:01:56.177 launcher main Download from https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar had invalid checksum! Expected: 2e9a3e3107cca00d6bc9c97bf7d149cae163ef21 got: 04292004f7145d1d991b8808d2976f9dc8db5cba 17:01:56.741 launcher main Download from https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar passed checksum check. 17:01:56.741 launcher main Downloaded https://piston-data.mojang.com/v1/objects/2e9a3e3107cca00d6bc9c97bf7d149cae163ef21/client.jar to C:\Users\User\curseforge\minecraft\Install\versions\forge-40.1.0\forge-40.1.0.jar 17:01:56.741 launcher main Downloads successful 17:01:56.741 launcher main TIMER: Downloads took 0 seconds. 17:01:56.741 launcher main Downloading Java Runtime java-runtime-beta:17.0.1.12.1 17:01:57.506 launcher main Extracting 8 files! 17:01:58.159 launcher main Using default game log configuration client-1.12.xml (outputs XML) 17:02:00.387 cpw.mods.modlauncher.Launcher main ModLauncher running: args [--username, Pixelcaft, --version, forge-40.1.0, --gameDir, C:\Users\User\curseforge\minecraft\Instances\test (3), --assetsDir, C:\Users\User\curseforge\minecraft\Install\assets, --assetIndex, 1.18, --uuid, d5bb472870874443847c9b99c9bf273f, --accessToken, ❄❄❄❄❄❄❄❄, --clientId, NDdmNzk3ZjctMzZmMS00YWI0LTkyNzktNGYyMDQwYjUwYmRl, --xuid, 2535455300377521, --userType, msa, --versionType, release, --width, 1024, --height, 768, --launchTarget, forgeclient, --fml.forgeVersion, 40.1.0, --fml.mcVersion, 1.18.2, --fml.forgeGroup, net.minecraftforge, --fml.mcpVersion, 20220404.173914] 17:02:00.393 cpw.mods.modlauncher.Launcher main ModLauncher 9.1.3+9.1.3+main.9b69c82a starting: java version 17.0.1 by Microsoft 17:02:00.537 mixin main SpongePowered MIXIN Subsystem Version=0.8.5 Source=union:/C:/Users/User/curseforge/minecraft/Install/libraries/org/spongepowered/mixin/0.8.5/mixin-0.8.5.jar%2314!/ Service=ModLauncher Env=CLIENT 17:02:00.603 net.minecraftforge.fml.loading.FMLConfig main Configuration file C:\Users\User\curseforge\minecraft\Instances\test (3)\config\fml.toml is not correct. Correcting 17:02:00.612 net.minecraftforge.fml.loading.FMLConfig main Incorrect key [defaultConfigPath] was corrected from null to defaultconfigs 17:02:01.245 launcher main Exception in thread "main" java.io.UncheckedIOException: java.io.IOException: Invalid paths argument, contained no existing paths: [C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-srg.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-extra.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraftforge\forge\1.18.2-40.1.0\forge-1.18.2-40.1.0-client.jar] at cpw.mods.securejarhandler@1.0.3/cpw.mods.jarhandling.impl.Jar.<init>(Jar.java:74) at cpw.mods.securejarhandler@1.0.3/cpw.mods.jarhandling.SecureJar.from(SecureJar.java:58) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.ModJarMetadata.buildFile(ModJarMetadata.java:41) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.MinecraftLocator.scanMods(MinecraftLocator.java:33) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.moddiscovery.ModDiscoverer.discoverMods(ModDiscoverer.java:50) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.FMLLoader.beginModScan(FMLLoader.java:166) at MC-BOOTSTRAP/fmlloader@1.18.2-40.1.0/net.minecraftforge.fml.loading.FMLServiceProvider.beginScanning(FMLServiceProvider.java:86) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServiceDecorator.runScan(TransformationServiceDecorator.java:112) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.lambda$runScanningTransformationServices$8(TransformationServicesHandler.java:100) at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197) at java.base/java.util.HashMap$ValueSpliterator.forEachRemaining(HashMap.java:1779) at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:509) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:499) at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:575) at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260) at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:616) at java.base/java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:622) at java.base/java.util.stream.ReferencePipeline.toList(ReferencePipeline.java:627) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.runScanningTransformationServices(TransformationServicesHandler.java:102) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.TransformationServicesHandler.initializeTransformationServices(TransformationServicesHandler.java:55) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.Launcher.run(Launcher.java:87) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.Launcher.main(Launcher.java:77) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:26) at MC-BOOTSTRAP/cpw.mods.modlauncher@9.1.3/cpw.mods.modlauncher.BootstrapLaunchConsumer.accept(BootstrapLaunchConsumer.java:23) at cpw.mods.bootstraplauncher@1.0.0/cpw.mods.bootstraplauncher.BootstrapLauncher.main(BootstrapLauncher.java:149) Caused by: java.io.IOException: Invalid paths argument, contained no existing paths: [C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-srg.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraft\client\1.18.2-20220404.173914\client-1.18.2-20220404.173914-extra.jar, C:\Users\User\curseforge\minecraft\Install\libraries\net\minecraftforge\forge\1.18.2-40.1.0\forge-1.18.2-40.1.0-client.jar] ... 25 more 17:02:01.245 monitor Process Monitor Process crashed with exit code 1
    • why do you work with .schematic file? From what I know are .schematic files a community creation and not used by vanilla you can take a look how they are written
    • I did look at vanilla code, but I don't understand how it works. For example, what does the PoseStack do? How should I use the buffers? And how does it "attach" to the model?
    • I've got a problem with schematics generation. So actually after reading .schematic file I'm getting two arrays of bytes (blockid and blockdata). The problem is I dont know how to obtain a BlockState for Level#setBlock (2nd parameter), because I dont know what kind of block I'm going to place, just id and data, and I see no static plug for this parameter (Like BlockState.WHATEVER).  So how can I deal with it? 
  • Topics

×
×
  • Create New...

Important Information

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