--- a/net/minecraft/world/item/BoneMealItem.java
+++ b/net/minecraft/world/item/BoneMealItem.java
@@ -33,12 +_,17 @@
 
     @Override
     public InteractionResult useOn(UseOnContext context) {
+        // CraftBukkit start - extract bonemeal application logic to separate, static method
+        return BoneMealItem.applyBonemeal(context);
+    }
+    public static InteractionResult applyBonemeal(UseOnContext context) {
+        // CraftBukkit end
         Level level = context.getLevel();
         BlockPos clickedPos = context.getClickedPos();
         BlockPos blockPos = clickedPos.relative(context.getClickedFace());
         if (growCrop(context.getItemInHand(), level, clickedPos)) {
             if (!level.isClientSide) {
-                context.getPlayer().gameEvent(GameEvent.ITEM_INTERACT_FINISH);
+                if (context.getPlayer() != null) context.getPlayer().gameEvent(GameEvent.ITEM_INTERACT_FINISH); // CraftBukkit - SPIGOT-7518
                 level.levelEvent(1505, clickedPos, 15);
             }
 
@@ -48,7 +_,7 @@
             boolean isFaceSturdy = blockState.isFaceSturdy(level, clickedPos, context.getClickedFace());
             if (isFaceSturdy && growWaterPlant(context.getItemInHand(), level, blockPos, context.getClickedFace())) {
                 if (!level.isClientSide) {
-                    context.getPlayer().gameEvent(GameEvent.ITEM_INTERACT_FINISH);
+                    if (context.getPlayer() != null) context.getPlayer().gameEvent(GameEvent.ITEM_INTERACT_FINISH); // CraftBukkit - SPIGOT-7518
                     level.levelEvent(1505, blockPos, 15);
                 }