The bug
Get a bucket of water and place it on some tall grass. The water will be placed behind the tall grass as if the grass isn't even there.
Other blocks such as cobwebs are affected as well:
Demonstration Video
The reason/Code analysis
See this comment by @unknown
Linked issues
is duplicated by 5
relates to 2
Attachments
Comments 10
Still a concern in 1.7.5 and 1.8

Confirmed for
16w20a

Can this be reopened because this behavior doesn't work consistently across other similar blocks.
Ticket is up for review.
Happens with strings too. https://www.reddit.com/r/Minecraft/comments/4uum6b/til_you_can_place_water_through_string_but_not/

This really should be reopened. I've had a look at the code, and the problem is very clear and easy to fix.
The following is based on 1.10.2 decompiled with MCP, with some edited variable names for clarity. Please link to this comment in the description.
When you right click with a bucket, full buckets will ignore liquids when raycasting, while empty buckets will not.
RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, bucketIsEmpty);
^
useLiquids
The bug happens because all blocks with no collision are treated as liquids by this function.
protected RayTraceResult rayTrace(World worldIn, EntityPlayer playerIn, boolean useLiquids)
{
float f = playerIn.rotationPitch;
...code omitted...
return worldIn.rayTraceBlocks(vec3d, vec3d1, useLiquids, !useLiquids, false);
^ ^
stopOnLiquid ignoreBlockWithoutBoundingBox
}
A quick fix would be to add a second function that doesn't assume it should do this:
protected RayTraceResult rayTrace(World worldIn, EntityPlayer playerIn, boolean useLiquids)
{
return rayTrace(worldIn, playerIn, useLiquids, !useLiquids);
}
protected RayTraceResult rayTrace(World worldIn, EntityPlayer playerIn, boolean useLiquids, boolean ignoreBlockWithoutBoundingBox)
{
float f = playerIn.rotationPitch;
...code omitted...
return worldIn.rayTraceBlocks(vec3d, vec3d1, useLiquids, ignoreBlockWithoutBoundingBox, false);
}
and then to use the new function when using buckets:
RayTraceResult raytraceresult = this.rayTrace(worldIn, playerIn, bucketIsEmpty, false);
That way, all other raycasts would have the same functionality as before, and water/lava could be placed on signs and things. Alternatively, swap that false
for a true
, and buckets would consistently ignore those blocks.

fixed

Seems to be fixed indeed, but likely in a version prior to 1.15-pre6

I can confirm this has been fixed in 18w01a and attached two videos: one demonstrating a fixed version, the other demonstrating a bugged version.
Confirmed.