Jump to content

How to make the player do something when the held item breaks


FireDragon033632

Recommended Posts

It is easy. Just add setContainerItem(THE_ITEM_TO_CHANGE) in the constructor of your item.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

Hi, I've been searching all over the internet looking for how to do something when the item breaks but I can't find anything. I'm trying to make it so when my item breaks it gives me another item (by the way I'm modding on 1.7.2). Can anyone help?

 

Thanks In Advance

 

Not sure if this would work for you, but there is an event called PlayerDestroyItemEvent that might be what you need.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Could someone please tell me how to format them properly, that might be the problem. For "setContainerItem()" I tried putting |--- this.setContainerItem(SwordsMod.BrokenHilt); ---| and for "PlayerDestroyItemEvent" I tried |--- public void PlayerDestroyItemEvent(ItemStack itemstack, World world, EntityPlayer player) {

player.inventory.addItemStackToInventory(new ItemStack(SwordsMod.BrokenHilt, 1));

} ---|

Link to comment
Share on other sites

Oh then edit the Item#setDamage method. It would be called any time when the damage is changed.

You may check if the damage is 0.

I. Stellarium for Minecraft: Configurable Universe for Minecraft! (WIP)

II. Stellar Sky, Better Star Rendering&Sky Utility mod, had separated from Stellarium.

Link to comment
Share on other sites

 

That topic is a bit old. I've got most of a tutorial on events drafted as well, updated for 1.7.2 which may help some people.  FireDragon, you can check it out here: http://jabelarminecraft.blogspot.com/p/minecraft-forge-172-event-handling.html

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Could you give me an example of a way to give item on break? Here's the code for giving the item:

public void WHATEVER_EVENT(EntityPlayer player) {

player.inventory.addItemStackToInventory(new ItemStack(SwordsMod.BrokenHilt, 1));

}

Also I'm completely confused about the Item#setDamage, could you show me an example of that?

Link to comment
Share on other sites

Again, that is not how you listen for events.

The Event is called PlayerDestroyItemEvent.

I know the event's called PlayerDestroyItemEvent, the code I actually tried was(as stated in jabelars tutorial):

public void onEvent(PlayerDestroyItemEvent event){

event.entityPlayer.inventory.addItemStackToInventory(new ItemStack(SwordsMod.BrokenHilt, 1));

}

I typed WHATEVER_EVENT(EntityPlayer player) so nobody would get confused as to why it said player instead of EntityPlayer. The only reason it's there is to show how to add an item to inventory to make it easier to show me an example.

Link to comment
Share on other sites

Did you do have the @SubscribeEvent annotation on the method?  Did you register the handling class on the right event bus?

 

Also, I usually put in a System.out.println("PlayerDestroyItemEvent handler called"); type of console message in the method to confirm whether the handler is actually being called.

 

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

Well, it is old, but the system still works the same.

 

Generally, but the details are different.  For example back then people used @ForgeSubscribe annotation, now it is @SubscribeEvent, also I think some of the actual available events are different.  There is the FML bus now too, etc.

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

If you are not completely stupid it's easy to figure that out...

 

You'd think.  But there seem to be a lot of people asking questions without much knowledge of Java.  You seem to have a lot of patience for noobs today but some of these threads make me laugh -- i see you tell them exactly what to do and they do something different then you tell them again and they do something different...

Check out my tutorials here: http://jabelarminecraft.blogspot.com/

Link to comment
Share on other sites

I made it give me an item when it breaks through TutEventHandler with this code:

public class TutEventHandler {

 

  @SubscribeEvent

    public void onEvent(PlayerDestroyItemEvent event) {

event.entityPlayer.inventory.addItemStackToInventory(new ItemStack(SwordsMod.BrokenHilt, 1));

}

}

 

I still need an 'if' statement to determine what item broke, any ideas for what 'if' statement I should use.

 

Thanks for the help up until now  :D

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.