Jump to content

Recommended Posts

Posted (edited)

Before I start explaining my situation, I am aware of similar questions on the forum, but so far haven't found a solution.

I am working on a mod that adds new copper blocks, and struggle with making them waxable. (New blocks exist, age, and have waxed counterparts already.)

Waxable blocks, and their waxed counterparts, are stored in an ImmutableBiMap in the HoneycombItem class, as a static variable.
So far I tried creating a new honeycomb item that extends the original, and then registering it using the same name and a separate DeferredRegister with "minecraft" as modid, but that doesn't work, as I can't modify a static variable in retrospect.
I also looked into mixIn and bytecode manipulation, but I'm hoping to find an easier solution.

If additional info is needed, I can gladly provide that, but I dont think the code of my failed attempt would be useful here.

Also apologies if this is a stupid question, while I'm not new to Java or programming in general, I am new to modding minecraft.

 

Edit: Forgot to add, im working with Minecraft version 1.20

Edited by Kipama
Forgot Minecraft version
Posted

You can use PlayerInteractEvent.RightClickBlock to detect if the player has clicked on the block with a certain item, and modify the block accordingly.

I'm not good at modding, but at least I can read a crash report (well enough). That's something, right?

Posted (edited)

 

10 hours ago, Hipposgrumm said:

You can use PlayerInteractEvent.RightClickBlock to detect if the player has clicked on the block with a certain item, and modify the block accordingly.

Thanks for putting me on the right track!

I was able to use the RightClickBlock event to check for the held item being honeycomb already.

However, I have 2 remaining issues:
1. Checking the clicked block. I know I have to look up the block using the pos provided in the event, but don't know how to do that yet.
2. If the block is waxable, how to actually replace it with the waxed version.

 

I hope you'll be able to help me with this, and sorry once again for these basic questions.

Edited by Kipama
Posted (edited)

You do not put your processing in the RightClickBlock event handler.

 

The purpose of that event is so you can choose which action is performed if the event matches your criteria, either

* setUseItem => Item.useOn() - in your example the processing in the HoneycombItem.useOn()

* setUseBlock => Block.use() - for you, the processing you define in YourBlock.use()

 

The block is passed to you in the event as a raytrace result:

https://github.com/MinecraftForge/MinecraftForge/blob/ab70bde1d648125acee073a93a25d4b8f08985c9/src/main/java/net/minecraftforge/event/entity/player/PlayerInteractEvent.java#L169

Read the rest of the docs of that event for all the details you need to know.

 

As mentioned above, HoneycombItem.useOn() has the vanilla processing for changing the block amongst other things.

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.

Posted
10 hours ago, warjort said:

setUseBlock => Block.use() - for you, the processing you define in YourBlock.use()

First off, thanks for taking the time to reply, your comments already helped me a lot!

I do however still have a few problems with actually triggering the use() function in my block.

I tried the following:

 @SubscribeEvent
public static void PlayerInteractEvent(PlayerInteractEvent.RightClickBlock event) {
    if(event.getItemStack().getItem() == Items.HONEYCOMB) {
        if(targetedBlock.equals(ModBlocks.SWIFT_POWERED_RAIL.get())){
            event.setResult(Event.Result.ALLOW);

            event.setUseBlock(event.getResult());
		}
	}
}

I tried to set the result to allow, and triggered setUseBlock with the Allow result.

I also tried this, which is probably really stupid but I tried it anyways:

instance.level.getBlockState(pos).getBlock().use(blockstate, level, pos, player, event.getHand(),event.getHitVec());

 

Any advice on how I can actually trigger the use() function in my block?

Posted (edited)

https://forums.minecraftforge.net/topic/125952-levelsetblock-doesnt-work/#comment-542689

Quote

NOTE: If you don't want your questions to be ignored, you need to provide a simple build that reproduces your problem.

Preferably on github.

Do not post code in the forums (especially incomplete code snippets).

e.g. what is "targettedBlock"? It is neither defined in that code nor what you should be using

Quote

 

You also do not DENY the item path (although it is probably not relevant in this case?)

Quote

Read the rest of the docs of that event for all the details you need to know.

 

Personally, I will ignore all your posts if you are one of those people that don't read my answers and force me to keep repeating myself.

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.

Posted
45 minutes ago, warjort said:
Quote

NOTE: If you don't want your questions to be ignored, you need to provide a simple build that reproduces your problem.

Preferably on github.

Here is a link to my repository. The linked branch should contain everything you might need.

The relevant classes are

1. src/main/java/net/lordkipama/modernminecarts/event/ModEvents.java   This is where I implemented PlayerInteractEvent.RightClickBlock

2. src/main/java/net/lordkipama/modernminecarts/block/Custom/SwiftPoweredRailBlock.java

 

There you can also so where targetedBlock comes from. It is simply a variable for instance.level.getBlockState(pos).getBlock();
Are there any benefits to using getHitVec() over what I did?
Apologies for not including that in the snipped.

Additionally, I added the result DENY to useItem(), although this doesn't impact my problem, as useItem should do nothing in this case.

 

Now to my current issue:

How to reproduce:
Start Minecraft, place Swift Powered Rail, rightClick with Honeycomb in hand.

Expected Behaviour:
For SwiftPoweredRailblock.use() to trigger, therefore replacing the Block with a Waxed Exposed Swift Rail.

Actual Behaviour:
Nothing happens, the use function never gets called.

 

I hope reproducing the issue works, and that I followed your advice sufficiently this time. If not, please tell me what to improve, I get that its tiresome to respond to people who don't seem to listen, but I'm genuinely trying to improve.

Posted

There is no link?

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.

Posted
1 hour ago, warjort said:

There is no link?

FML...

I did manage to find my error though!

For anyone finding this in the future, I didn't pass use() in my block the right parameters. They should be (BlockState state, Level level, BlockPos pos, Player player, InteractionHand interactionHand, BlockHitResult blockHitResult).

 

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 want to understand how complex mods with ASM transformation and coremods work, such as Xray or AntiXray. Why do they break when you simply rename packages? What features of their architecture make refactoring difficult? And what techniques are used to protect these mods? I am interested in technical aspects in order to better understand the bytecode and Forge loader system."
    • I can't figure out if you're looking for help trying to steal someone elses work, or cheat at the game....
    • Title: Why Is It So Hard to Rename and Restructure Mods Like Xray or AntiXray? 🤔 Post text: Hey everyone! I’ve been digging into Minecraft modding for a while and have one big question that I can’t figure out on my own. Maybe someone with more experience could help or give me some advice. Here’s the issue: When I take a “normal” Minecraft mod — for example, one that just adds some blocks or new items — I can easily change its structure, package names, or even rebrand it entirely. It’s straightforward. But as soon as I try this with cheat-type mods like XrayMod or AntiXray, everything falls apart. Even if I just rename the classes, refactor the packages, or hide its identity somehow, the mod either breaks or stops working properly. XrayMod in particular is proving to be a nightmare to modify without losing its core function. So my question is — why is this so much harder with cheat mods like Xray? Is there something fundamentally different about how they’re coded, loaded, or protected that prevents simple renaming or restructuring? And if so, how can I actually learn to understand someone else’s cheat mod enough to safely refactor it without breaking the core features? I’ve already been spending over two months trying to figure this out and haven’t gotten anywhere. It feels like there must be some trick or knowledge I’m missing. Would really appreciate any thoughts, tips, or references — maybe there are guides or techniques for understanding cheat-mod internals? Or if you’ve successfully “disguised” a cheat mod like Xray before, I’d love to hear how you did it. Thanks in advance for any help or discussion. ✌️
    • just started making cinamatic contect check it out on my channel or check out my facebook page    Humbug City Minecraft Youtube https://www.youtube.com/watch?v=v2N6OveKwno https://www.facebook.com/profile.php?id=61575866982337  
    • Where did you get the schematic? Source/Link? And do use an own modpack or a pre-configured from curseforge? If yes, which one On a later time, I can make some tests on my own - but I need the schematic and the modpack name
  • Topics

×
×
  • Create New...

Important Information

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