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

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Hi everyone, I'm currently developing a Forge 1.21 mod for Minecraft and I want to display a custom HUD overlay for a minigame. My goal: When the game starts, all players should see an item/block icon (from the base game, not a custom texture) plus its name/text in the HUD – similar to how the bossbar overlay works. The HUD should appear centered above the hotbar (or at a similar prominent spot), and update dynamically (icon and name change as the target item changes). What I've tried: I looked at many online tutorials and several GitHub repos (e.g. SeasonHUD, MiniHUD), but most of them use NeoForge or Forge versions <1.20 that provide the IGuiOverlay API (e.g. implements IGuiOverlay, RegisterGuiOverlaysEvent). In Forge 1.21, it seems that neither IGuiOverlay nor RegisterGuiOverlaysEvent exist anymore – at least, I can't import them and they are missing from the docs and code completion. I tried using RenderLevelStageEvent as a workaround but it is probably not intended for custom HUDs. I am not using NeoForge, and switching the project to NeoForge is currently not an option for me. I tried to look at the original minecraft source code to see how elements like hearts, hotbar etc are drawn on the screen but I am too new to Minecraft modding to understand. What I'm looking for: What is the correct way to add a custom HUD element (icon + text) in Forge 1.21, given that the previous overlay API is missing? Is there a new recommended event, callback, or method in Forge 1.21 for custom HUD overlays, or is everyone just using a workaround? Is there a minimal open-source example repo for Forge 1.21 that demonstrates a working HUD overlay without relying on NeoForge or deprecated Forge APIs? My ideal solution: Centered HUD element with an in-game item/block icon (from the base game's assets, e.g. a diamond or any ItemStack / Item) and its name as text, with a transparent background rectangle. It should be visible to the players when the mini game is running. Easy to update the item (e.g. static variable or other method), so it can change dynamically during the game. Any help, code snippets, or up-to-date references would be really appreciated! If this is simply not possible right now in Forge 1.21, it would also help to know that for sure. Thank you very much in advance!
    • The simple answer is there is not an easy way. You would need to know how to program in Java, as well as at least some familiarity with how Forge works so you could port the differences. You would also need the sourcecode for the original mod, and permission from the author to modify it, if they did not use some sort of open source license. So it's not impossible, but it would take some effort, but doing so would open up a whole new world of possibilities for you!
    • Does it still crash if you remove holdmyitems? Looks like that mod doesn't work on a server as far as I can tell from the error.  
    • Crashes the server when trying to start. Error code -1. Log  
  • Topics

×
×
  • Create New...

Important Information

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