Jump to content

[SOLVED][1.19.4] Link vanilla block entity to modded block


JimiIT92

Recommended Posts

I'm trying to create some lectern blocks, and so far the block itself works. However the rendering of the book doesn't, and by looking at the debugger it seems that the renderer class doesn't get linked to the custom block, even thou I'm not using a custom block class. So I've tried to instead create my own lectern block entity, however the LecternBlockEntity constructor doesn't allow to change the blockentitytype (is hardcoded into the constructor itself), so if I had to do this I'd have to basically clone the entire class, which is something I want to avoid.

This is how I register the block
 

public static final RegistryObject<Block> SPRUCE_LECTERN = RegisterHelper.registerBlock("spruce_lectern", () -> new LecternBlock(PropertyHelper.copyFromBlock(Blocks.LECTERN)));

You can see the full implementation here to check what the helper methods does: https://github.com/JimiIT92/MineWorld/blob/master/src/main/java/org/mineworld/core/MWBlocks.java#L1183

I've also already created the block entity and the rendering like so
 

public static final RegistryObject<BlockEntityType<LecternBlockEntity>> SPRUCE_LECTERN = RegisterHelper.registerBlockEntity("spruce_lectern", LecternBlockEntity::new, MWBlocks.SPRUCE_LECTERN);

//rendering
BlockEntityRenderers.register(SPRUCE_LECTERN.get(), LecternRenderer::new);

You can also see this here: https://github.com/JimiIT92/MineWorld/blob/master/src/main/java/org/mineworld/core/MWBlockEntityTypes.java#L19

 

So how can I attach the vanilla block entity to my custom block? Or at least make so that the custom lectern block will use the custom block entity type, but without copy/pasting the entire class, if is even possible?

Edited by JimiIT92
solved

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

https://github.com/MinecraftForge/MinecraftForge/blob/d4f211b81586d24ab6b734c7815fc067579b09b9/src/main/java/net/minecraftforge/client/event/EntityRenderersEvent.java#L93

 

But as to why it doesn't work, look at the constructor for LecternBlockEntity and what BlockEntityType it hardwires.

In general you can't reuse vanilla blocks because of such hardwiring made by Mojang.

 

In this case, you can probably hack it by doing something like (untested pseudo code):

public class MyLecternBlockEntity extends LecternBlockEntity {

    public MyLecternBlockEntity(BlockPos p_155622_, BlockState p_155623_) {
        super(p_155622_, p_155623_);
    }

    // Make this block entity return your type
    @Override
    public BlockEntityType<?> getType() {
        return MWBlockEntityTypes.SPRUCE_LECTERN.get();
    }
}

public class MyLecternBlock extends LecternBlock {

    public MyLecternBlock(Properties p_54479_) {
        super(p_54479_);
    }

    // Make the block create your block entity 
    @Override
    public BlockEntity newBlockEntity(BlockPos p_153573_, BlockState p_153574_) {
        return new MyLecternBlockEntity(p_153573_, p_153574_);
    }
}

but such hacks only work when there isn't other hardcoding elsewhere.

e.g. you will also have to use an event to workaround the hardwiring of the LecternBlock instance in Writable/WrittenBookItem.useOn()

There might be other places?

 

Edited by warjort

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

Yeah I've tried doing a custom block that extends LecternBlock and creates a custom LecternBlockEntity, but unfortunately the LecternBlockEntity hardwires the BlockEntityType.LECTERN into the constructor :/ If I do that I can surely solve the issue, as I can link the custom block entity to the LecternRederer class using BlockEntityRenderers, is just that I'm wondering if I can avoid duplicating the class, since it would be harder to mantain in future due to changes.

As for the book I've already hooked it up on the RightClickBlock event and using the static tryPlaceBook method on the block class itself, so that's not really an issue

EDIT:
Ok, I got it, and I feel so dumb to not thought about this earlier. Turns out that all I needed to do is to override the getType method inside the custom block entity

 

public class MWLecternBlockEntity extends LecternBlockEntity {

    public MWLecternBlockEntity(final BlockPos blockPos, final BlockState blockState) {
        super(blockPos, blockState);
    }

    @Override
    public @NotNull BlockEntityType<?> getType() {
        return MWBlockEntityTypes.SPRUCE_LECTERN.get();
    }
}

And inside the custom block I now instantiate this block entity instead
 

@Override
        public BlockEntity newBlockEntity(BlockPos blockPos, BlockState blockState) {
            return new MWLecternBlockEntity(blockPos, blockState);
        }

This way I don't need to copy the vanilla class and can hook up my custom block entity type to the vanilla render
 

Edited by JimiIT92
found solution

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

Quote

but unfortunately the LecternBlockEntity hardwires the BlockEntityType.LECTERN into the constructor

Yes, but look at how my class overrides getType() to ignore that value and return your own.

Boilerplate:

If you don't post your logs/debug.log we can't help you. For curseforge you need to enable the forge debug.log in its minecraft settings. You should also post your crash report if you have one.

If there is no error in the log file and you don't have a crash report then post the launcher_log.txt from the minecraft folder. Again for curseforge this will be in your curseforge/minecraft/Install

Large files should be posted to a file sharing site like https://gist.github.com  You should also read the support forum sticky post.

Link to comment
Share on other sites

1 minute ago, warjort said:

but look at how my class overrides getType() to ignore that value and return your own

Ironically I've just did that without noticing your comment 😅 I've edited my previous answer, and again feel so dumb for not thinking about that before 😅 Closing this, thank you for the help as always :)

Don't blame me if i always ask for your help. I just want to learn to be better :)

Link to comment
Share on other sites

  • JimiIT92 changed the title to [SOLVED][1.19.4] Link vanilla block entity to modded block

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

    • I have now easily fixed the duplication error present, I was just not looking.   I have been working for the past half hour to try and fix another error present, this time with the Creative Mode Tab.   I have changed some things around to get where I am currently. (ModFoods to ModDrinks*) and it cannot find the symbol ".get" at the end of the code. *The custom class you recommended pOutput.accept(ModDrinks.ORANGE_JUICE.get()); I think the point I am at currently is the closest I have to how it should be but because I am not as experienced with java I would not know.  I have also removed ORANGE_JUICE and LEMON_JUICE from the ModFoods class, to avoid confliction. I do hope all this can be fully resolved soon.  
    • [SOLVED]  public class RenderGUIHandler { @SubscribeEvent public void renderGUI(RenderGameOverlayEvent.Text event){ Client.hud.draw(); } } As I was playing around a little with the code, i found out about an option to change The RenderGameOverlayEvent.Post to RenderGameOverlayEvent.Text
    • public class HUD { public Minecraft mc = Minecraft.getMinecraft(); public static class ModuleComparator implements Comparator<Module>{ @Override public int compare(Module o1, Module o2) { if (Minecraft.getMinecraft().fontRendererObj.getStringWidth(o1.name) > Minecraft.getMinecraft().fontRendererObj.getStringWidth(o2.name)){ return -1; } if (Minecraft.getMinecraft().fontRendererObj.getStringWidth(o1.name) < Minecraft.getMinecraft().fontRendererObj.getStringWidth(o2.name)){ return 1; } return 0; } } public void draw(){ ScaledResolution sr = new ScaledResolution(mc); FontRenderer fr = mc.fontRendererObj; Collections.sort(Client.modules, new ModuleComparator()); GlStateManager.pushMatrix(); GlStateManager.translate(4,4,0); GlStateManager.scale(1.5,1.5,1); GlStateManager.translate(-4, -4, 0); fr.drawString("Skyline", 10, 10, -1); GlStateManager.popMatrix(); int count = 0; for (Module m : Client.modules){ if (!m.toggled || m.name.equals("TabGUI")) continue; int offset = count* (fr.FONT_HEIGHT + 6); GL11.glTranslated(0.0f, 0.0f, -1.0f); Gui.drawRect(sr.getScaledWidth() - fr.getStringWidth(m.name) - 10, offset, sr.getScaledWidth() - fr.getStringWidth(m.name) - 8, 6 + fr.FONT_HEIGHT + offset, -1); Gui.drawRect(sr.getScaledWidth() - fr.getStringWidth(m.name) - 8, offset, sr.getScaledWidth(), 6 + fr.FONT_HEIGHT + offset, 0x90000000); fr.drawString(m.name, sr.getScaledWidth() - fr.getStringWidth(m.name) - 4, offset + 4, -1); count++; } Client.onEvent(new EventRenderGUI()); } } I have just recently stumbled upon this Problem, where the HudRenderer renders the wrong section of the textures and therefore completely destroys the Minecraft Armour and Hunger Bar. I am currently thinking if it is an issue with the DrawRect changing something it shouldn't. But I couldn't find anything about it. (To keep things Clean, the function is Called from another file) public class RenderGUIHandler { @SubscribeEvent public void renderGUI(RenderGameOverlayEvent.Post event){ Client.hud.draw(); } } Any help would be greatly appreciated  
    • Hello, I play on a private server (forge 47.2.0) (about 200 mods) with my friends. Everything is normal until the game crashes. I assume it's due to the generation of a chunk, possibly in a biome from the Aquamirae mod. Caused by: java.lang.NullPointerException: No chunk exists at [9, 38]     at net.minecraft.server.level.WorldGenRegion.m_6325_(WorldGenRegion.java:2079) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.server.level.WorldGenRegion.m_6924_(WorldGenRegion.java:375) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.levelgen.structure.structures.ShipwreckPieces$ShipwreckPiece.m_213694_(ShipwreckPieces.java:127) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.levelgen.structure.StructureStart.m_226850_(StructureStart.java:90) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkGenerator.m_223080_(ChunkGenerator.java:320) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at com.google.common.collect.ImmutableList.forEach(ImmutableList.java:422) ~[guava-31.1-jre.jar%2374!/:?]     at net.minecraft.world.level.chunk.ChunkGenerator.m_213609_(ChunkGenerator.java:319) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus.m_279978_(ChunkStatus.java:108) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus$SimpleGenerationTask.m_214024_(ChunkStatus.java:309) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.world.level.chunk.ChunkStatus.m_280308_(ChunkStatus.java:252) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$27(ChunkMap.java:643) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at com.mojang.datafixers.util.Either$Left.map(Either.java:38) ~[datafixerupper-6.0.8.jar%2377!/:?]     at net.minecraft.server.level.ChunkMap.lambda$scheduleChunkGeneration$29(ChunkMap.java:634) ~[server-1.20.1-20230612.114412-srg.jar%23375!/:?]     at java.util.concurrent.CompletableFuture$UniCompose.tryFire(CompletableFuture.java:1150) ~[?:?]     ... 11 more
    • that fixed it! Thank you soo much!!! If there is a way I can like upvote your profile or something let me know!
  • Topics

×
×
  • Create New...

Important Information

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