Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

Item not breaking in PlayerInteractEvent.RightClickBlock event


Recommended Posts

I am trying to implement a right-click interaction between a vanilla tool and a vanilla block (so I can't use onBlockActivated or onItemUse). Everything is working fine except my call to ItemStack#attemptDamageItem, because the PlayerEntity I get from PlayerInteractEvent.RightClickBlock#getPlayer() is an instance of ClientPlayerEntity, not a ServerPlayerEntity. However, ItemStack#attemptDamageItem expects a ServerPlayerEntity only. I tried passing in null as the damager parameter, and this almost works, but the item doesn't break when reaching 0 durability. This may be, because the ITEM_DURABILITY_CHANGED trigger never fires when damager is null. Now my question: How can I get access to a ServerPlayerEntity instance, or alternatively, how can I make sure the item breaks when reaching 0 durability?

My code looks as follows:

public void onInteract(PlayerInteractEvent.RightClickBlock event) {
    World world = event.getWorld();
    ItemStack stack = event.getItemStack();
    BlockPos pos = event.getPos();
    BlockState state = world.getBlockState(pos);
    Direction face = event.getFace();
    PlayerEntity player = event.getPlayer();

    if (stack.getItem() instanceof ShearsItem && state.getBlock().equals(Blocks.GRASS_BLOCK) && Objects.equals(face, Direction.UP)) {
        if (!player.isCreative()) {
            if (player instanceof ServerPlayerEntity)
                stack.attemptDamageItem(1, world.rand, (ServerPlayerEntity) player);
                stack.attemptDamageItem(1, world.rand, null);

        BlockState above = world.getBlockState(pos.up());
                        .with(LawnBlock.SNOWY, above.matchesBlock(Blocks.SNOW_BLOCK) || above.matchesBlock(Blocks.SNOW))
                        .with(LawnBlock.FACING, player.getHorizontalFacing().getOpposite())

        world.playSound(player, pos, SoundEvents.BLOCK_GRASS_PLACE, SoundCategory.BLOCKS, 1.0F, 1.0F);
        player.swing(event.getHand(), true);



Link to comment
Share on other sites

I'm sorry if this is a stupid question, but how would I do that? Because right now, the PlayerEntity is never an instance of ServerPlayerEntity (my check never returns true)

Link to comment
Share on other sites

1 hour ago, jonaskohl said:

I'm sorry if this is a stupid question, but how would I do that? Because right now, the PlayerEntity is never an instance of ServerPlayerEntity (my check never returns true)

which version of minecraft did you use, since PlayerEntity is not a mojang mapping

Link to comment
Share on other sites

I realized that I'm still on 1.16.4 with MCP mappings, so I probably can't expect any support...

(I tried upgrading the mod to 1.18.2, but that went, uhm, let's say horrible, as so much has changed between 1.16.4 and 1.18.2 and I couldn't find a migration guide, so the mod would require a major rewrite, but that's an entierly different topic...)

Link to comment
Share on other sites

This topic is now closed to further replies.

  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • Yep, it's what the title says I only found out how to generate flowers and didn't find the the thingy with all the configured features are Would be nice if someone could help! Thanks
    • I started a server with PlayerRevive/Tombstone mod and when I die and I respawn I don't stop dying. Also I have a Issue with FramedBlocks: when I put one block of this mod, the server crashes and closes. I put here the server log: [16:55:36 ERROR]: Exception caught during firing event: Cannot invoke "net.minecraft.world.World.func_201670_d()" because "this.field_145850_b" is null         Index: 11         Listeners:                 0: HIGHEST                 1: ASM: class ovh.corail.tombstone.event.EventHandler onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 2: NORMAL                 3: ASM: class com.mrcrayfish.guns.common.DelayedTask onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 4: ASM: class shadows.placebo.util.PlaceboTaskQueue tick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 5: ASM: com.dairymoose.modernlife.core.ModernLifeCommon@501855c1 onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 6: ASM: com.github.alexthe666.citadel.server.CitadelEvents@7bca1184 onServerTickEvent(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 7: ASM: me.ichun.mods.ichunutil.common.core.EventHandlerServer@41275fcc onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 8: ASM: net.minecraftforge.common.ForgeInternalHandler@5495b2c1 onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 9: ASM: class com.simibubi.create.events.CommonEvents onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 10: ASM: class net.geforcemods.securitycraft.SCEventHandler onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 11: ASM: class xfacthd.framedblocks.common.util.EventHandler onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 12: ASM: class com.hollingsworth.arsnouveau.api.event.EventQueue serverTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 13: ASM: com.mrcrayfish.obfuscate.common.data.SyncedPlayerData@2c57ecfc onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 14: ASM: noppes.npcs.ServerTickHandler@30710a3e onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V                 15: ASM: com.sk89q.worldedit.forge.ThreadSafeCache@37b339fc tickStart(Lnet/minecraftforge/event/TickEvent;)V                 16: LOWEST                 17: ASM: ovh.corail.tombstone.proxy.ServerProxy@5a4a21ad onServerTick(Lnet/minecraftforge/event/TickEvent$ServerTickEvent;)V java.lang.NullPointerException: Cannot invoke "net.minecraft.world.World.func_201670_d()" because "this.field_145850_b" is null         at xfacthd.framedblocks.common.tileentity.FramedTileEntity.checkSolidStateOnLoad(FramedTileEntity.java:539)         at java.base/java.util.ArrayList.forEach(ArrayList.java:1511)         at xfacthd.framedblocks.common.util.EventHandler.onServerTick(EventHandler.java:84)         at net.minecraftforge.eventbus.ASMEventHandler_485_EventHandler_onServerTick_ServerTickEvent.invoke(.dynamic)         at net.minecraftforge.eventbus.ASMEventHandler.invoke(ASMEventHandler.java:85)         at net.minecraftforge.eventbus.EventBus.post(EventBus.java:302)         at net.minecraftforge.eventbus.EventBus.post(EventBus.java:283)         at net.minecraftforge.fml.hooks.BasicEventHooks.onPreServerTick(BasicEventHooks.java:113)         at net.minecraft.server.MinecraftServer.func_71217_p(MinecraftServer.java:1001)         at net.minecraft.server.MinecraftServer.func_240802_v_(MinecraftServer.java:818)         at net.minecraft.server.MinecraftServer.func_240783_a_(MinecraftServer.java:269)         at java.base/java.lang.Thread.run(Thread.java:833) [16:55:36 ERROR]: Encountered an unexpected exception [16:55:36 FATAL]: Preparing crash report with UUID 62ce1105-b5dd-4f30-9af8-999e3f1f687f [16:55:37 ERROR]: This crash report has been saved to: /home/container/./crash-reports/crash-2022-09-29_16.55.36-server.txt
    • Been looking everywhere, just hope this helps someone. As of 1.19.2 the only way that doesn't cause problems would be to use push(). Unless someone is brighter than me lol.   @SubscribeEvent public static void onLivingJump(LivingEvent.LivingJumpEvent event){ float jumpMultiplier = 0.07F; if (event.getEntity() instanceof Player){ event.getEntity().push(0,jumpMultiplier,0); }  
  • Topics

  • Create New...

Important Information

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