Mojira Archive
MC-168264

Sugar cane cannot be placed on farmland

The Bug

Inconsistent behavior with many other plant blocks. One would expect that sugar cane can be planted on farmland because almost all other plants can, however, this is not the case.

Steps to Reproduce

  1. Build the setup as shown in the attachment below. setup.png
  2. Obtain some sugar cane and attempt to place one on each of the six blocks.
  3. Take note as to what blocks you can place sugar cane on and what blocks you can't.

Observed Behavior

Sugar cane cannot be placed on farmland.

Expected Behavior

Sugar cane would be able to be placed on farmland.

Code Analysis

Code Analysis done by [Mod] Anthony Cicinelli

This happens because there is no check for farmland in the canSurvive method

Current Code

net/minecraft/world/level/block/SugarCaneBlock.java
   public boolean canSurvive(BlockState p_57175_, LevelReader p_57176_, BlockPos p_57177_) {
      BlockState blockstate = p_57176_.getBlockState(p_57177_.below());
      if (blockstate.is(this)) {
         return true;
      } else {
         if (blockstate.is(BlockTags.DIRT) || blockstate.is(Blocks.SAND) || blockstate.is(Blocks.RED_SAND){
            BlockPos blockpos = p_57177_.below();

            for(Direction direction : Direction.Plane.HORIZONTAL) {
               BlockState blockstate1 = p_57176_.getBlockState(blockpos.relative(direction));
               FluidState fluidstate = p_57176_.getFluidState(blockpos.relative(direction));
               if (fluidstate.is(FluidTags.WATER) || blockstate1.is(Blocks.FROSTED_ICE)) {
                  return true;
               }
            }
         }

         return false;
      }
   }
   }

Fixed Code

net/minecraft/world/level/block/SugarCaneBlock.java
   public boolean canSurvive(BlockState p_57175_, LevelReader p_57176_, BlockPos p_57177_) {
      BlockState blockstate = p_57176_.getBlockState(p_57177_.below());
      if (blockstate.is(this)) {
         return true;
      } else {
         //Adding a check for Farmland fixes MC-168264
         if (blockstate.is(BlockTags.DIRT) || blockstate.is(Blocks.SAND) || blockstate.is(Blocks.RED_SAND) || blockstate.is(Blocks.FARMLAND)) {
            BlockPos blockpos = p_57177_.below();

            for(Direction direction : Direction.Plane.HORIZONTAL) {
               BlockState blockstate1 = p_57176_.getBlockState(blockpos.relative(direction));
               FluidState fluidstate = p_57176_.getFluidState(blockpos.relative(direction));
               if (fluidstate.is(FluidTags.WATER) || blockstate1.is(Blocks.FROSTED_ICE)) {
                  return true;
               }
            }
         }

         return false;
      }
   }
   }