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
Build the setup as shown in the attachment below. setup.png
Obtain some sugar cane and attempt to place one on each of the six blocks.
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 @unknown
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;
}
}
}
Linked issues
Attachments
Comments 20
There are quite a few plants that can't be placed on Farmland. They are Bamboo (handle by tags), Cactus, Dead Bush, Brown Mushroom, Red Mushroom, Sea Pickles, all non-full block Coral variants, and Kelp. Surprisingly, Seagrass can be placed on underwater Farmland but not Kelp.
So I think Sugar Cane not being on Farmland may be on purpose. But there's definitely inconsistencies with underwater plants tho.
doesn't this work as intended?