Jump to content

Recommended Posts

Posted

can some one please make me a block with a custom render from scratch with all the files needed?? because i cant find any tutorials that explain it well and every time i try it crashes minecraft. also I'm using forge 1.4.6-6.5.0.487

Posted

i have tried that already but it doesn't explain it very well. i always get an error when i type this line

renderId = this.getRenderId();

it says it needs to be static but when i change it to static it tells me to remove the static modifier from getRenderId

Posted

I'm converting a mod I wrote from ModLoader to Forge. The current issue is my custom block renderer. It just isn't getting called. I also have a problem with "renderId", is that modelId or something else? There doesn't appear to be anything to allocate modelId like ModLoader. Do I just assign them from zero on myself, with custom modelId for my renderer? If so, what is renderId? Does that allow multiple renderers for a single package?

 

What I did was assign modelId starting at 0 (this mod has 3 custom block renderers), and assign renderId as 0. If I got that wrong, it should render every block with the first renderer. But my renderer isn't being called at all, it's using default block style with my texture.

 

One issue is with registering a renderer. I used the tutorial, the same one linked above. It's written for Minecraft 1.3. It says to add a line to registerRenderInformation in my package Proxy. That line is:

RenderingRegistry.instance().registerBlockHandler(new BoozeRender());

The problem is "instance" is marked Depricated. So what is the new/current way of registering a block renderer?

Posted

If you are interested in making a custom block from scratch, take a look at this : http://www.minecraftforum.net/topic/1483366-universal-subarakis-one-stop-custom-block-tutorial-make-it-with-techne/

its written for modloader, but most of the code is still relevant and very useful. I find it is also very good at explaining what some of the numbers do, so you are able to fiddle around with them and create your own features.

Posted
  On 1/17/2013 at 1:36 AM, Maurice753 said:
can some one please make me a block with a custom render from scratch with all the files needed?? because i cant find any tutorials that explain it well and every time i try it crashes minecraft. also I'm using forge 1.4.6-6.5.0.487

I figured it out on my own. I used this tutorial to convert my renderer from ModLoader to Forge.

http://www.minecraftforge.net/wiki/Upgrading_To_Forge_for_1.3.1#Custom_Block_renders

 

The explanation of renderId isn't very good. But I got it to work. Here's what I did. Your render class has...

public class yourBlockRenderClass implements ISimpleBlockRenderingHandler
{
    ...
    @Override
    public int getRenderId();
    {
         return 0;
    }
}

That method "getRenderId" in your render class is useless. It just distracts you. Don't use it for anything. It has to be there, or your code won't "compile", but just return something simple, such as always return zero.

 

Your block class has to return renderId. That's how the game knows which render class to call. ModLoader called it a modelId, so I'll use that name. The method in your block class is "getRenderType", so watch the name change.

@Override
    public int getRenderType()
    {
        return mod_YourMod.yourblockModelId;
    }

 

This renderId has to be static, so store it in your mod class.

package yourPackage;

@Mod(modid = "mod_YourMod", name = "YourMod", version = "someNumber")
@NetworkMod(clientSideRequired=true, serverSideRequired = true)
public class mod_YourMod
{
@SidedProxy(clientSide = "yourPackage.YourModClient", serverSide= "yourPackage.YourModProxy")
    public static YourModProxy proxy;

@Instance("mod_YourMod")
    public static mod_YourMod instance;

    public static int yourblockModelId;
...
}

 

Next is the important part, the thing missing from the tutorial. Assign your renderId, what ModLoader called a modelId. This is done in your proxy client class. And to make it more clear, I've written this to assign modelId for 3 blocks.

package yourPackage;

import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;

public class YourModClient extends YourModProxy
{
    @Override
    public void registerRenderInformation()
    {
        MinecraftForgeClient.preloadTexture("/yourPackage/terrain.png");
        MinecraftForgeClient.preloadTexture("/yourPackage/items.png");
        mod_YourMod.yourblockModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        mod_YourMod.block2ModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        mod_YourMod.block3ModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.yourblockModelID , new YourModRender());
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.block2ModelID , new YourModRender());
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.block3ModelID , new YourModRender());
    }
}

 

You will have to write method "renderWorldBlock" in your render class (here called YourModRender) to have a switch statement, call a different method for each renderId (aka modelId).

Posted
  On 1/23/2013 at 3:52 PM, rbdyck said:

  Quote
can some one please make me a block with a custom render from scratch with all the files needed?? because i cant find any tutorials that explain it well and every time i try it crashes minecraft. also I'm using forge 1.4.6-6.5.0.487

I figured it out on my own. I used this tutorial to convert my renderer from ModLoader to Forge.

http://www.minecraftforge.net/wiki/Upgrading_To_Forge_for_1.3.1#Custom_Block_renders

 

The explanation of renderId isn't very good. But I got it to work. Here's what I did. Your render class has...

public class yourBlockRenderClass implements ISimpleBlockRenderingHandler
{
    ...
    @Override
    public int getRenderId();
    {
         return 0;
    }
}

That method "getRenderId" in your render class is useless. It just distracts you. Don't use it for anything. It has to be there, or your code won't "compile", but just return something simple, such as always return zero.

 

Your block class has to return renderId. That's how the game knows which render class to call. ModLoader called it a modelId, so I'll use that name. The method in your block class is "getRenderType", so watch the name change.

@Override
    public int getRenderType()
    {
        return yourModClass.yourblockModelId;
    }

 

This renderId has to be static, so store it in your mod class.

package yourPackage;

@Mod(modid = "mod_YourMod", name = "YourMod", version = "someNumber")
@NetworkMod(clientSideRequired=true, serverSideRequired = true)
public class mod_YourMod
{
@SidedProxy(clientSide = "yourPackage.YourModClient", serverSide= "yourPackage.YourModProxy")
    public static YourModProxy proxy;

@Instance("mod_YourMod")
    public static mod_YourMod instance;

    public static int yourblockModelId;
...
}

 

Next is the important part, the thing missing from the tutorial. Assign your renderId, what ModLoader called a modelId. This is done in your proxy client class. And to make it more clear, I've written this to assign modelId for 3 blocks.

package yourPackage;

import cpw.mods.fml.client.registry.RenderingRegistry;
import net.minecraftforge.client.MinecraftForgeClient;

public class YourModClient extends YourModProxy
{
    @Override
    public void registerRenderInformation()
    {
        MinecraftForgeClient.preloadTexture("/yourPackage/terrain.png");
        MinecraftForgeClient.preloadTexture("/yourPackage/items.png");
        mod_YourMod.yourblockModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        mod_YourMod.block2ModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        mod_YourMod.block3ModelID = RenderingRegistry.instance().getNextAvailableRenderId();
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.yourblockModelID , new YourModRender());
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.block2ModelID , new YourModRender());
        RenderingRegistry.instance().registerBlockHandler(mod_YourMod.block3ModelID , new YourModRender());
    }
}

 

You will have to write method "renderWorldBlock" in your render class (here called YourModRender) to have a switch statement, call a different method for each renderId (aka modelId).

 

 

 

i dont get anymore errors but now minecraft runs out of memory :'(.  What do i type in the renderWorldBlock??

Posted

    @SideOnly(CLIENT)
    private void RenderYourblock(Block block, int x, int y, int z, RenderBlocks renderblocks)
    {
        ...
        return true;
    }

    @SideOnly(CLIENT)
    private void RenderBlock2(Block block, int x, int y, int z, RenderBlocks renderblocks)
    {
        ...
        return true;
    }

    @SideOnly(CLIENT)
    private void RenderBlock3(Block block, int x, int y, int z, RenderBlocks renderblocks)
    {
        ...
        return true;
    }

    @Override
    public boolean renderWorldBlock(IBlockAccess world, int x, int y, int z, Block block, int modelID, RenderBlocks renderer)
    {
    if(modelID == mod_YourMod.yourblockModelID) 
    	{ 
    		return RenderYourblock(block, x, y, z, renderer);
    	}
    	else if(modelID == mod_YourMod.block2ModelID)
    	{
    		return RenderBlock2(block, x, y, z, renderer);
    	}
    	else if(modelID == mod_YourMod.block3ModelID)
    	{
    		return RenderBlock3(block, x, y, z, renderer);
    	}
    	else
    	{
    		return false;
    	}
    }

Here I used if...else if... statements instead of a switch. Why? Eh! Whatever.

Individual render methods do not have @Override, just renderWorldBlock. But those individual render methods have @SideOnly(CLIENT) so they aren't included in server code. Don't want to bog down a server. I think you can add that to renderWorldBlock as well. Your proxy client is only run on the client side anyway, so the render class won't get registered on a server.

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.