Jump to content

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


qpwoeiruty

Recommended Posts

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.

Link to comment
Share on other sites

Use the PlayerEvent.BreakSpeed event and cancled it or set the newSpeed to -1.

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/

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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);

 

}

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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);

	}

}

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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.

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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/

Link to comment
Share on other sites

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);

 

}

 

}

 

}

 

Link to comment
Share on other sites

 

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

 

 

Link to comment
Share on other sites

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?

Link to comment
Share on other sites

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; }

Link to comment
Share on other sites

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.

 

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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Sonic77 adalah pilihan tepat bagi Anda yang menginginkan pengalaman bermain slot yang unggul dengan akun pro Swiss terbaik. Berikut adalah beberapa alasan mengapa Anda harus memilih Sonic77: Slot Gacor Terbaik Kami menyajikan koleksi slot gacor terbaik dari provider terkemuka. Dengan fitur-fitur unggulan dan peluang kemenangan yang tinggi, Anda akan merasakan pengalaman bermain yang tak terlupakan. Akun Pro Swiss Berkualitas Kami menawarkan akun pro Swiss yang berkualitas dan terpercaya. Dengan akun ini, Anda dapat menikmati berbagai keuntungan eksklusif dan fasilitas premium yang tidak tersedia untuk akun reguler.
    • SV388 SITUS RESMI SABUNG AYAM 2024   Temukan situs resmi untuk sabung ayam terpercaya di tahun 2024 dengan SV388! Dengan layanan terbaik dan pengalaman bertaruh yang tak tertandingi, SV388 adalah tempat terbaik untuk pecinta sabung ayam. Daftar sekarang untuk mengakses arena sabung ayam yang menarik dan nikmati kesempatan besar untuk meraih kemenangan. Jelajahi sensasi taruhan yang tak terlupakan di tahun ini dengan SV388! [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]   JURAGANSLOT88 SITUS JUDI SLOT ONLINE TERPERCAYA 2024 Jelajahi pengalaman judi slot online terpercaya di tahun 2024 dengan JuraganSlot88! Sebagai salah satu situs terkemuka, JuraganSlot88 menawarkan berbagai pilihan permainan slot yang menarik dengan layanan terbaik dan keamanan yang terjamin. Daftar sekarang untuk mengakses sensasi taruhan yang tak terlupakan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan JuraganSlot88 [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
    • Slot Bank MEGA atau Daftar slot Bank MEGA bisa anda lakukan pada situs WINNING303 kapanpun dan dimanapun, Bermodalkan Hp saja anda bisa mengakses chat ke agen kami selama 24 jam full. keuntungan bergabung bersama kami di WINNING303 adalah anda akan mendapatkan bonus 100% khusus member baru yang bergabung dan deposit. Tidak perlu banyak, 5 ribu rupiah saja anda sudah bisa bermain bersama kami di WINNING303 . Tunggu apa lagi ? Segera Klik DAFTAR dan anda akan jadi Jutawan dalam semalam.
    • ladangtoto situs resmi ladangtoto situs terpercaya 2024   Temukan situs resmi dan terpercaya untuk tahun 2024 di LadangToto! Dengan layanan terbaik dan keamanan yang terjamin, LadangToto adalah pilihan utama untuk penggemar judi online. Daftar sekarang untuk mengakses berbagai jenis permainan taruhan, termasuk togel, kasino, dan banyak lagi. Jelajahi sensasi taruhan yang tak terlupakan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan LadangToto!" [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
    • WINNING303 DAFTAR SITUS JUDI SLOT RESMI TERPERCAYA 2024 Temukan situs judi slot resmi dan terpercaya untuk tahun 2024 di Winning303! Daftar sekarang untuk mengakses pengalaman berjudi slot yang aman dan terjamin. Dengan layanan terbaik dan reputasi yang kokoh, Winning303 adalah pilihan terbaik bagi para penggemar judi slot. Jelajahi berbagai pilihan permainan dan raih kesempatan besar untuk meraih kemenangan di tahun ini dengan Winning303 [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]] [[jumpuri:❱❱❱❱❱ DAFTAR DI SINI ❰❰❰❰❰ > https://w303.pink/orochimaru]]
  • Topics

×
×
  • Create New...

Important Information

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