Jump to content

[1.7.10][Unsolved] Making my block only breakable with my pickaxe only


Tixal

Recommended Posts

Hi, My blocks are instantly breaking with any tool and i want them to only break with my pick.

 

I have this in my block class:

this.setHarvestLevel("pickaxe", 4);

 

And this is the material my pick is "made" from:

public static Item.ToolMaterial DungeonMaterial = EnumHelper.addToolMaterial("DungeonMaterial", 4, 3122, 14.0F, 3.0F, 17);

 

With a diamond pick the blocks break instantly but don't drop the item. With my pick they break instantly and the blocks do drop.

Help me make my block only break with my pickaxe and drop!

 

Thanks

    - Tixal

Link to comment
Share on other sites

I'm not sure what you mean exactly.

 

Do you want your block to be completely unbreakable (like bedrock) unless someone uses your pickaxe,  in which case it breaks normally?

 

If so you can just not worry about setting the harvest level of the block, and use the BlockEvent.BreakEvent, check if the block that's being harvested is your block, check if the item that is being used is your pickaxe, and if not cancel the event. Something like

 

@SubscribeEvent
public void onBlockBroken(BlockEvent.BreakEvent event)
{
    if(event.block instanceof YourBlockType && !(event.getPlayer().inventory.getCurrentItem().getItem() instanceof YourPickaxe)
    {
        event.setCancelled(true);
    }
}

 

EDIT: I forgot to mention, you'd also want to check that event.getPlayer().getCurrentItem() != null before calling geItem() because I believe if the player is using an empty hand getItem() on null throws a NPE.

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

Link to comment
Share on other sites

Do you want your block to be completely unbreakable (like bedrock) unless someone uses your pickaxe,  in which case it breaks normally?

 

Yes that is exactly what I want.

 

I will go and try your solution now

 

Thanks

    - Tixal

 

Link to comment
Share on other sites

Hi,

 

I have no idea how in use that code snip-it :( im a bit of a newb,

 

I changed it so it will work with my blocks and tool and has no errors but it does nothing, Im guessing I did it wrong

I added the code to my main class, I have never used events properly before so im not sure how to use it.

 

My full project can be found here:https://github.com/Tixal/Mythical-Items  if that helps you help me

 

Thanks

    - Tixal

Link to comment
Share on other sites

Create a class for your event handling, then register that class using

MinecraftForge.EVENT_BUS.register(InstanceOfYourEventHandlerClass);

 

In that class create a method like the one I posted earlier.

BEFORE ASKING FOR HELP READ THE EAQ!

 

I'll help if I can. Apologies if I do something obviously stupid. :D

 

If you don't know basic Java yet, go and follow these tutorials.

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

    • They were already updated, and just to double check I even did a cleanup and fresh update from that same page. I'm quite sure drivers are not the problem here. 
    • i tried downloading the drivers but it says no AMD graphics hardware has been detected    
    • Update your AMD/ATI drivers - get the drivers from their website - do not update via system  
    • As the title says i keep on crashing on forge 1.20.1 even without any mods downloaded, i have the latest drivers (nvidia) and vanilla minecraft works perfectly fine for me logs: https://pastebin.com/5UR01yG9
    • Hello everyone, I'm making this post to seek help for my modded block, It's a special block called FrozenBlock supposed to take the place of an old block, then after a set amount of ticks, it's supposed to revert its Block State, Entity, data... to the old block like this :  The problem I have is that the system breaks when handling multi blocks (I tried some fix but none of them worked) :  The bug I have identified is that the function "setOldBlockFields" in the item's "setFrozenBlock" function gets called once for the 1st block of multiblock getting frozen (as it should), but gets called a second time BEFORE creating the first FrozenBlock with the data of the 1st block, hence giving the same data to the two FrozenBlock :   Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=head] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@73681674 BlockEntityData : id:"minecraft:bed",x:3,y:-60,z:-6} Old Block Fields set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=3, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} Frozen Block Entity set BlockState : Block{minecraft:black_bed}[facing=east,occupied=false,part=foot] BlockPos{x=2, y=-60, z=-6} BlockEntity : net.minecraft.world.level.block.entity.BedBlockEntity@6d1aa3da BlockEntityData : {id:"minecraft:bed",x:2,y:-60,z:-6} here is the code inside my custom "freeze" item :    @Override     public @NotNull InteractionResult useOn(@NotNull UseOnContext pContext) {         if (!pContext.getLevel().isClientSide() && pContext.getHand() == InteractionHand.MAIN_HAND) {             BlockPos blockPos = pContext.getClickedPos();             BlockPos secondBlockPos = getMultiblockPos(blockPos, pContext.getLevel().getBlockState(blockPos));             if (secondBlockPos != null) {                 createFrozenBlock(pContext, secondBlockPos);             }             createFrozenBlock(pContext, blockPos);             return InteractionResult.SUCCESS;         }         return super.useOn(pContext);     }     public static void createFrozenBlock(UseOnContext pContext, BlockPos blockPos) {         BlockState oldState = pContext.getLevel().getBlockState(blockPos);         BlockEntity oldBlockEntity = oldState.hasBlockEntity() ? pContext.getLevel().getBlockEntity(blockPos) : null;         CompoundTag oldBlockEntityData = oldState.hasBlockEntity() ? oldBlockEntity.serializeNBT() : null;         if (oldBlockEntity != null) {             pContext.getLevel().removeBlockEntity(blockPos);         }         BlockState FrozenBlock = setFrozenBlock(oldState, oldBlockEntity, oldBlockEntityData);         pContext.getLevel().setBlockAndUpdate(blockPos, FrozenBlock);     }     public static BlockState setFrozenBlock(BlockState blockState, @Nullable BlockEntity blockEntity, @Nullable CompoundTag blockEntityData) {         BlockState FrozenBlock = BlockRegister.FROZEN_BLOCK.get().defaultBlockState();         ((FrozenBlock) FrozenBlock.getBlock()).setOldBlockFields(blockState, blockEntity, blockEntityData);         return FrozenBlock;     }  
  • Topics

×
×
  • Create New...

Important Information

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