Jump to content

[1.11.2] [SOLVED] Cancel Render of EntityItems


Draconwolver

Recommended Posts

Quite simply, I am trying to create a client-side only mod that will allow the user to hide certain entities from their view by preventing them from being rendered. Is there one specific event within Forge that would allow me to cancel the rendering of any entity? RenderPlayerEvent::Pre appears to be able to be used to prevent the rendering of players, but I am unsure of how to use RenderLivingEvent, and I see no event relating to the rendering of nonliving entities such as items.  RenderTickEvent seems to not have any way of getting the entities that will be/were rendered in that tick.

 

Any help is much appreciated. Thank you!

Edited by Draconwolver
Link to comment
Share on other sites

6 hours ago, Draconwolver said:

but I am unsure of how to use RenderLivingEvent

You use it in the exact same way you would use RenderPlayerEvent. It also has a cancelable Pre sub-event.

I do not currently see any event related to EntityItem rendering, that might be impossible to cancel.

Link to comment
Share on other sites

2 hours ago, diesieben07 said:

You would have to override the renderer for EntityItem. You do this using RenderingRegistry.registerEntityRenderingHandler.

Please excuse me for needing guidance. Here is what I have in my FMLPreInitializationEvent handler:

@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
	RenderingRegistry.registerEntityRenderingHandler(EntityItem.class, new RenderItemFactory());
}

My RenderItemFactory class:

public class RenderItemFactory implements IRenderFactory<EntityItem>
{
	@Override
	public Render<? super EntityItem> createRenderFor(RenderManager manager)
	{
		return new RenderEntityItem(manager, new RenderAnItem(/* What arguments do I use? */));
	}
}

My RenderAnItem class:

public class RenderAnItem extends RenderItem
{
	public RenderAnItem(TextureManager textureManager, ModelManager modelManager, ItemColors itemColors)
	{
		super(textureManager, modelManager, itemColors);
		/* What goes here? */
	}
}

Have I approached this wrong, or am I on the right track? Thanks.

Edited by Draconwolver
Link to comment
Share on other sites

9 hours ago, diesieben07 said:

You need to extend RenderEntityItem, not RenderItem.

Thanks, I got it working by simply returning in the RenderEntityItem::doRender method that I overrode. However, what if I wanted to only hide specific kinds of EntityItems? If I copy the whole code for the RenderEntityItem::doRender method and paste it in my method override, there are some private fields that I do not have access to. Should I copy those in my class, too?

 

EDIT: I was able to cancel the rendering of only one kind of item (e.g., diamonds) by copying and pasting like I explained above. Continuing with the additional complexity theme, is there a way to make this rendering toggleable through a KeyBinding or whatnot, or is this way of rendering permanent once the game loads?

Edited by Draconwolver
Link to comment
Share on other sites

1 hour ago, Draconwolver said:

Thanks, I got it working by simply returning in the RenderEntityItem::doRender method that I overrode. However, what if I wanted to only hide specific kinds of EntityItems? If I copy the whole code for the RenderEntityItem::doRender method and paste it in my method override, there are some private fields that I do not have access to. Should I copy those in my class, too?

 

EDIT: I was able to cancel the rendering of only one kind of item (e.g., diamonds) by copying and pasting like I explained above. Continuing with the additional complexity theme, is there a way to make this rendering toggleable through a KeyBinding or whatnot, or is this way of rendering permanent once the game loads?

Try using inheritance. Check for your item, if you want to render it, call super.doRender. If you want to not render it, just return.

  • Like 1
Link to comment
Share on other sites

9 hours ago, Alpvax said:

Try using inheritance. Check for your item, if you want to render it, call super.doRender. If you want to not render it, just return.

Oh, of course! I don't have access to my workspace right now, but I understand. Thanks!

 

EDIT: Alrighty, I got it. Here's my FMLPreInitializationEvent handler:

@EventHandler
public void preInit(FMLPreInitializationEvent event)
{
	RenderingRegistry.registerEntityRenderingHandler(EntityItem.class, new DiamondRenderFactory());
}

And my DiamondRenderFactory class:

public class DiamondRenderFactory implements IRenderFactory<EntityItem>
{
	@Override
	public Render<? super EntityItem> createRenderFor(RenderManager manager)
	{
		return new RenderDiamond(manager, Minecraft.getMinecraft().getRenderItem());
	}
}

And finally my RenderDiamond class:

public class RenderDiamond extends RenderEntityItem
{
	public RenderDiamond(RenderManager renderManagerIn, RenderItem p_i46167_2_)
	{
		super(renderManagerIn, p_i46167_2_);
	}
	
	@Override
	public void doRender(EntityItem entity, double x, double y, double z, float entityYaw, float partialTicks)
	{
		if (entity.getEntityItem().getItem() != Items.DIAMOND)
		{
			super.doRender(entity, x, y, z, entityYaw, partialTicks);
		}
	}
}

 

Edited by Draconwolver
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
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.