Jump to content

[Solved] [1.7.2] Preventing Players Harvesting Blocks With Their Fists


Recommended Posts

Posted

I am trying to create a mod that makes the game more challenging, and so I would like to be able to remove the feature in vanilla Minecraft that allows the player to harvest wood through the power of their fist. However, I am not entirely sure how this would be possible as everywhere I looks seems to lead me back to changing the harvest level of the vanilla blocks, but this doesn't seem to do anything or I cannot get it working correctly. So I am wondering if anyone knew how this could be done, or could link me to any useful sources. If so this would be highly appreciated, thanks.

Posted

Firstly, thanks for the fast reply, but I am quite new to modding and events seem to be something I cannot get my head round. Could you show me how I would go about this as I have tried some events before and couldn't get them working. Sorry if this is really simple, I just have a poor understanding of events.

Posted

First,you need to make a class and register that in the MinecraftForge.EVENT_BUS. Then you need to make a method, eg. setBreakSpeed and put the PlayerEvent.BreakSpeed in that as a parameter. After that, put the @SubscribeEvent annotation above the method. In that method you can set the newSpeed of the event and that's it! If you need more help, post your code so we can help.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Wow, thanks again for another quick reply, I will try that out now...

 

Well that was certainly one step in the right direction something is actually happening; the player can no longer break any blocks. However, they can't break any blocks with tools either which is not exactly what I wanted. Considering I entered one line of code inside my method I'm sure there is a way around this.

 

  @SubscribeEvent

public void setBreakSpeed(PlayerEvent.BreakSpeed event) {

 

event.setCanceled(true);

 

}

Posted

In the event (or actually the parent class, which is PlayerEvent), you also get a EntityPlayer object, so you can use that to check if entityPlayer.getCurrentEquippedItem() is null and then cancel the event.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Alright will do thanks...

 

I am using this and don't really understand whats wrong with it:

private boolean objectInHand = true;

@SubscribeEvent
public void objectInHand(EntityPlayer event) {

	if(event.getCurrentEquippedItem() != null) {

		objectInHand = false;

	}

}

@SubscribeEvent
public void setBreakSpeed(PlayerEvent.BreakSpeed event) {

	if(objectInHand = false) {

		event.setCanceled(true);

	} else {

		event.setCanceled(false);

	}

}

Posted

In the PlayerEvent.BreakSpeed you are given an entityPlayer object. You can use that to get the current item instead of the other @SubscribeEvent (EntityPlayer is not even an event). For your purpose you can use event.entityPlayer.getCurrentEquippedItem == null.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Now the problem arises that they can't break blocks when they nothing in their hand but they can say if they had a dirt block. So would I have to specify which blocks can be used with which tools? As in if the block they are mining equals stone and if they have a diamond pickaxe, allow them to break it.

Posted

You can use the ForgeHooks.isToolEffective method to check if the tool is effective for that block, and if it is, don't cancel it, but if it isn't, then cancel it.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Great thanks, but I don't really understand what to put in the parameters as it asks for (stack, block, metadata) and I thought it was just going to be like true or false.

Posted

Ok, the first parameter, stack, is the stack the player is currently using for mining the block. the second parameter, block is the block being broken, you get that passed in via the event, and the same goes for metadate, you get that passed in via the event.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

No, you need to do it this way:

if(!ForgeHoos.isToolEffective(event.entityPlayer.getCurrentEquippedItem(),event.block,event.metadata))
{
     event.setCanceled(true);
}

Please don't copy paste, but try to figure out what i did, so you can learn from it.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Look at what i did, i added a not sign (the thingy on the same key as the number, forget how to call it in english), before the ForgeHook.isToolEffective() call so if the was NOT effective, it would cancel it.

Don't PM me with questions. They will be ignored! Make a thread on the appropriate board for support.

 

1.12 -> 1.13 primer by williewillus.

 

1.7.10 and older versions of Minecraft are no longer supported due to it's age! Update to the latest version for support.

 

http://www.howoldisminecraft1710.today/

Posted

Hahaha yeah, both are working, but I am now getting a crash when I try and break a block with my fist but everything else works great. I believe it may have something to do with this error...

 

FML has detected a mod that is using a package name based on 'net.minecraft.src' : net.minecraft.src.FMLRenderAccessLibrary. This is generally a severe programming error.  There should be no mod code in the minecraft namespace. MOVE YOUR MOD! If you're in eclipse, select your source code and 'refactor' it into a new package. Go on. DO IT NOW!

 

...which sounds fairly bad, however I don't believe I am using a package based on 'net.minecraft.src' so I am confused.

 

Edit: Actually I don't think it does as when I remover the MinecraftForge.EVENT_BUS.register(new WSPEventHandler()); everything works fine, so I now I believe it is something to do with this line:

 

if(ForgeHooks.isToolEffective(event.entityPlayer.getCurrentEquippedItem(), event.block, event.metadata)) {

 

Its within this class:

 

package com.willr27survivalplus.handler;

 

import net.minecraft.block.Block;

import net.minecraft.entity.player.EntityPlayer;

import net.minecraft.init.Blocks;

import net.minecraft.init.Items;

import net.minecraft.item.ItemStack;

import net.minecraftforge.common.ForgeHooks;

import net.minecraftforge.event.entity.player.PlayerEvent;

import net.minecraftforge.event.world.BlockEvent;

import cpw.mods.fml.common.eventhandler.SubscribeEvent;

 

public class WSPEventHandler {

 

@SubscribeEvent

public void setBreakSpeed(PlayerEvent.BreakSpeed event) {

 

if(ForgeHooks.isToolEffective(event.entityPlayer.getCurrentEquippedItem(), event.block, event.metadata)) {

 

event.setCanceled(true);

 

} else {

 

event.setCanceled(false);

 

}

 

}

 

}

 

Posted

Hi

 

If you're getting a crash, post the crash log?

 

I'm guessing it's probably a NullPointerException, and it's probably caused by this

event.entityPlayer.getCurrentEquippedItem()

If the player isn't holding anything, it will be null.

 

-TGG

 

 

Posted

 

FYI, what I do when I get an error like this:

 

java.lang.NullPointerException: Unexpected error
at net.minecraftforge.common.ForgeHooks.isToolEffective(ForgeHooks.java:131)

Looking at ForgeHooks.java:131

    public static boolean isToolEffective(ItemStack stack, Block block, int metadata)
    {
        List toolClass = toolClasses.get(stack.getItem());          // NPE here
        return toolClass != null && toolEffectiveness.contains(Arrays.asList(block, metadata, toolClass.get(0)));
    }

 

Not sure what a NullPointerException is? 

Google ->

http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how-do-i-fix-it

 

So that means that I am using an object which is null.  There are only two on this line - stack and toolClasses.  Since stack is being provided by my code when it calls this method, it's a good guess that stack is null.

Why is it null?

It was called at com.willr27survivalplus.handler.WSPEventHandler.setBreakSpeed(WSPEventHandler.java:18)

      if(ForgeHooks.isToolEffective(event.entityPlayer.getCurrentEquippedItem(), event.block, event.metadata)) {

and that means that

event.entityPlayer.getCurrentEquippedItem()

returned null.

 

Why did it return null?  Well the name is a strong clue, because the crash only happens when you're not holding anything.

 

-TGG

 

 

Posted

Thanks for the very detailed explanation, I understand far better what a NullPointerException is now, however, how to fix it is still quite confusing as I am trying to take in a lot of new information at once. Would have to somewhere say that getCurrentEquippedItem() != null then, or have I misunderstood?

Posted

Basically what that means is you can't use the isToolEffective method when the player is not holding anything, because it expects an ItemStack, not a null pointer; so, if the player is not holding anything, or the currently held item is not effective against the current block, then cancel the event.

 

Translating the above statement into pseudocode:

if (currentItem == null || isToolEffective(currentItem, etc.)) { cancelEvent; }

Posted

I can't thank you all enough, this has been bugging me for a while and to finally get to a stage where the basics actually work is fantastic. Is there a simpler way than listing every single block to only have select blocks able to be broken, as I could just list every block but it would be very inefficient.

 

Edit: This does work (just listing all the blocks I want) so it is technically solved but anyone with any better ideas feel free to post them.

 

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

    • Reach Out To Rapid Digital: What sapp Info: +1 41 4 80 7 14 85 Email INFO: rap iddi gita lrecov ery @ exe cs. com Hello, my name is Jayson, and I’m 35 years old from the United Kingdom. My family and I recently endured an incredibly challenging experience that I wouldn’t wish on anyone. We became victims of a cryptocurrency investment fraud scheme that saw us lose a staggering $807,000 in USDT and Bitcoins. The fraudsters had created a convincing facade, and we were lured into investing, only to discover later that the platform was a complete scam. We were left devastated, not just financially, but emotionally, as we had trusted these people and believed in the legitimacy of the investment. After the initial shock wore off, we desperately searched for ways to recover the lost funds. It seemed like an impossible task, and we felt as though there was no hope. That’s when, by sheer luck, we stumbled across a post about Rapid Digital Recovery, a cryptocurrency and funds recovery organization with a proven track record in cybersecurity and fraud recovery. We decided to reach out to them, and from the first interaction, we were impressed with their professionalism and transparency. They explained the recovery process in detail and reassured us that they had the skills and expertise to track down the perpetrators and recover our funds. This gave us a renewed sense of hope, something we hadn’t felt in months. What truly stood out during our experience with Rapid Digital Recovery was their dedication to the recovery process. The team went above and beyond, using sophisticated tracking tools and cyber forensics to gather critical information. Within a matter of weeks, they had successfully located the funds and traced the scam back to the fraudsters responsible. They worked with the authorities to ensure the criminals were held accountable for their actions. To our relief, the team at Rapid Digital Recovery was able to recover every single penny we had lost. The funds were returned in full, and the sense of closure we felt was invaluable. We couldn’t have imagined such a positive outcome in the early stages of our recovery journey, and we are deeply grateful for the work they did. If you ever find yourself in a similar situation, I highly recommend contacting Rapid Digital Recovery. Their expertise, transparency, and dedication to their clients make them the go-to choice for anyone seeking to recover lost cryptocurrency or funds. They truly gave us back our financial future.  
    • This is my first time modding anything, so maybe just skill issue. I'm using Forge 54.0.12 and Temurin 21.0.5+11-LTS I wanted to create a custom keybind and to check whether it works I'd like to send a chat message. I tried using Minecraft.getInstance().player.sendSystemMessage(Component.literal("test")); but IntelliJ couldnt resolve sendSystemMessage(...). Since I saw people using it in earlier versions, I tried the same thing with 1.20.6(- 50.1.0), where it works fine, now I can't figure out if this is intentional and whether there are other options for sending chat messages. On that note, is there more documentation than https://docs.minecraftforge.net/en/1.21.x/? It seems very incomplete compared to something like the Oracle Java docs
    • Hi, i'm having this error and I wanna fix it. we try: -Reload drivers -Eliminate .minecraft -Eliminate Java -Restart launcher -Verify if minecraft is using gpu -Mods  in .minecraft is empty -Install the latest and recomended version of forge idk what i have to do, help me pls. the lastest log is: https://mclo.gs/WAMao8x  
    • Read the FAQ, Rule #2. (https://forums.minecraftforge.net/topic/125488-rules-and-frequently-asked-questions-faq/)  
  • Topics

×
×
  • Create New...

Important Information

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