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



×
×
  • Create New...

Important Information

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