Some Entities get stuck in upwards (soul sand) bubble columns
The bug:
Tnt, Falling blocks, and Xp orbs (only those that I know of currently, might be more) can get stuck in up going (soul sand) bubble columns. This is due to the order or events in the entities tick phase where the onGround tag perpetuates downward motion instead of upwards due to being in the column. (Watch video to understand better)
Example: https://youtu.be/drtWuTpykA4

The Setup:
Build the following:
(WARNING!! IT WILL EXPLODE BETWEEN TNT. YOU MUST REBUILD IT WHEN TESTING THE OTHER TNT)


Fire the Tnt one at a time to see the issue.
You can use the following command a few blocks above the soul sand to test xp orbs.
/summon minecraft:experience_orb ~ ~8 ~ {Motion:[0.0,-9.0,0.0]}
Code Analysis:
Using 20w49a yarn/fabric mappings:
We will be looking at the Tnt entity for this:
public class TntEntity //remove code public void tick() { if (!this.hasNoGravity()) { this.setVelocity(this.getVelocity().add(0.0, -0.04, 0.0)); } this.move(MovementType.SELF, this.getVelocity()); this.setVelocity(this.getVelocity().multiply(0.98)); if (this.onGround) { this.setVelocity(this.getVelocity().multiply(0.7, -0.5, 0.7)); } //remove code }
Here, we have the tick method of Tnt. For this, let us assume that the Tnt has enough downward motion to reach the soul sand of the bubble column (lets say -10.0 b/gt)
First we will add gravity to the motion making it -10.04 b/gt.
Next we will do a move method.
Without showing the code, what will happen is that it will collide with the soul sand, set it's velocity to 0 b/gt and set onGround to true then check more block collisions, in this case, bubble column. From 0 b/gt, it will set the velocity to 0.7 b/gt from the "onBubbleColumnCollision" method in the entity class.
Thirdly, (back in the Tnt tick method) we will multiply all axis motion by 0.98 (drag), thus making the y motion now 0.686 b/gt.
Fourthly, as onGround was set to true by the move method, it will multiple the Y axis by -0.5, thus making the velocity -0.343 b/gt
As we end up with a negative velocity, the onGround will be set to true in the next move method as it will collide with the soul sand and the cycle will continue. This makes the bubble column not work.
A Potential Fix:
If an entity has collided with a bubble column in the "checkBlockCollision()", set the OnGround tag to False. This may have unforeseen consequences, but I can't think of any as of now
Linked Issues
Created Issue:
Some Entities get stuck in up (soul sand) bubble columns
The bug:
Tnt, Falling blocks, and Xp orbs (only those that I know of currently, might be more) can get stuck in up going (soul sand) bubble columns. This is due to the order or events in the entities tick phase where the onGround tag perpetuates downward motion instead of upwards due to being in the column. (Watch video to understand better)
Example: https://youtu.be/drtWuTpykA4
The Setup:
Build the following:
(WARNING!! IT WILL EXPLODE BETWEEN TNT. YOU MUST REBUILD IT WHEN TESTING THE OTHER TNT)
Fire the Tnt one at a time to see the issue.
You can use the following command a few blocks above the soul sand to test xp orbs.
/summon minecraft:experience_orb ~ ~8 ~ {Motion:[0.0,-9.0,0.0]}
Code Analysis:
Using 20w49a yarn/fabric mappings:
We will be looking at the Tnt entity for this:
public class TntEntity //remove code public void tick() { if (!this.hasNoGravity()) { this.setVelocity(this.getVelocity().add(0.0, -0.04, 0.0)); } this.move(MovementType.SELF, this.getVelocity()); this.setVelocity(this.getVelocity().multiply(0.98)); if (this.onGround) { this.setVelocity(this.getVelocity().multiply(0.7, -0.5, 0.7)); } //remove code }Here, we have the tick method of Tnt. For this, let us assume that the Tnt has enough downward motion to reach the soul sand of the bubble column (lets say -10.0 b/gt)
First we will add gravity to the motion making it -10.04 b/gt.
Next we will do a move method.
Without showing the code, what will happen is that it will collide with the soul sand, set it's velocity to 0 b/gt and set onGround to true then check more block collisions, in this case, bubble column. From 0 b/gt, it will set the velocity to 0.7 b/gt from the "onBubbleColumnCollision" method in the entity class.
Thirdly, (back in the Tnt tick method) we will multiply all axis motion by 0.98 (drag), thus making the y motion now 0.686 b/gt.
Fourthly, as onGround was set to true by the move method, it will multiple the Y axis by -0.5, thus making the velocity -0.343 b/gt
As we end up with a negative velocity, the onGround will be set to true in the next move method as it will collide with the soul sand and the cycle will continue. This makes the bubble column not work.
A Potential Fix:
If an entity has collided with a bubble column in the "checkBlockCollision()", set the OnGround tag to False. This may have unforeseen consequences, but I can't think of any as of now
The bug:
Tnt, Falling blocks, and Xp orbs (only those that I know of currently, might be more) can get stuck in up going (soul sand) bubble columns. This is due to the order or events in the entities tick phase where the onGround tag perpetuates downward motion instead of upwards due to being in the column. (Watch video to understand better)
Example: https://youtu.be/drtWuTpykA4
The Setup:
Build the following:
(WARNING!! IT WILL EXPLODE BETWEEN TNT. YOU MUST REBUILD IT WHEN TESTING THE OTHER TNT)
Fire the Tnt one at a time to see the issue.
You can use the following command a few blocks above the soul sand to test xp orbs.
/summon minecraft:experience_orb ~ ~8 ~ {Motion:[0.0,-9.0,0.0]}
Code Analysis:
Using 20w49a yarn/fabric mappings:
We will be looking at the Tnt entity for this:
public class TntEntity //remove code public void tick() { if (!this.hasNoGravity()) { this.setVelocity(this.getVelocity().add(0.0, -0.04, 0.0)); } this.move(MovementType.SELF, this.getVelocity()); this.setVelocity(this.getVelocity().multiply(0.98)); if (this.onGround) { this.setVelocity(this.getVelocity().multiply(0.7, -0.5, 0.7)); } //remove code }Here, we have the tick method of Tnt. For this, let us assume that the Tnt has enough downward motion to reach the soul sand of the bubble column (lets say -10.0 b/gt)
First we will add gravity to the motion making it -10.04 b/gt.
Next we will do a move method.
Without showing the code, what will happen is that it will collide with the soul sand, set it's velocity to 0 b/gt and set onGround to true then check more block collisions, in this case, bubble column. From 0 b/gt, it will set the velocity to 0.7 b/gt from the "onBubbleColumnCollision" method in the entity class.
Thirdly, (back in the Tnt tick method) we will multiply all axis motion by 0.98 (drag), thus making the y motion now 0.686 b/gt.
Fourthly, as onGround was set to true by the move method, it will multiple the Y axis by -0.5, thus making the velocity -0.343 b/gt
As we end up with a negative velocity, the onGround will be set to true in the next move method as it will collide with the soul sand and the cycle will continue. This makes the bubble column not work.
A Potential Fix:
If an entity has collided with a bubble column in the "checkBlockCollision()", set the OnGround tag to False. This may have unforeseen consequences, but I can't think of any as of now
I can confirm. I also experienced this in my SP world. Re-entering the dimension (reloading chunks could also work) also makes the experience orbs unstuck.
relates to
Some Entities get stuck in upwards (soul sand) bubble columns
is duplicated by
is duplicated by
The bug
Tnt, Falling blocks, and Xp orbs (only those that I know of currently, might be more) don't bounce on slime blocks when falling into them. This is due to the order or events in the entities tick phase where the onGround tag perpetuates downward motion instead of upwards.
How to reproduce
- Place four slime blocks in a 2x2 pattern on the floor.
- Go in the middle of the 4 slime blocks and fly up 5 blocks
- Use the following command above the slime blocks
/summon minecraft:tnt ~ ~ ~ {fuse:100,Motion:[0.0,-9.0,0.0]}→
It will not bounce
Code analysis
Using Fabric mapping 1.16.5
Here, we will look at the tnt entity for this example. We will start in the tick phase where it handles its motion and velocity as well as other important stuff not related to this ticket. We will say that this entity is moving down in this example (negative velocity y). We are first going to go into the move method as that is called first:
public void tick() { REMOVED code as it was not needed this.move(MovementType.SELF, this.getVelocity()); REMOVED code as it was not needed if (this.onGround) { this.setVelocity(this.getVelocity().multiply(0.7, -0.5, 0.7)); } REMOVED code as it was not needed }
In the move method of the Entity class:
public void move(MovementType type, Vec3d movement) { REMOVE code above as it was not needed BlockPos lv2 = this.getLandingPos(); BlockState lv3 = this.world.getBlockState(lv2); REMOVED code here as it was not needed this.fall(lv.y, this.onGround, lv3, lv2); Vec3d lv4 = this.getVelocity(); Block lv5 = lv3.getBlock(); if (movement.y != lv.y) { lv5.onEntityLand(this.world, this); } REMOVED code here as it was not needed }
In the move method, the entity will try to go to it's final location using the velocity supplied in the parameters. If the y position hits a block, movement.y != lv.y, will be set to true and call onEntityLand, supplying a block, which in this case, that is a slime block.
Now looking in the onEnitiyLand code
@Override public void onEntityLand(BlockView world, Entity entity) { if (entity.bypassesLandingEffects()) { super.onEntityLand(world, entity); } else { this.bounce(entity); } }
As the tnt can't bypassesLandingEffects, it will call this.bounce(entity).
Now looking at the bounce:
private void bounce(Entity entity) { Vec3d lv = entity.getVelocity(); if (lv.y < 0.0) { double d = entity instanceof LivingEntity ? 1.0 : 0.8; entity.setVelocity(lv.x, -lv.y * d, lv.z); } }
As the tnt is being shot down, it has negative y velocity. Thus, the entities velocity will be set to a positive as it has its sign changed by -lv.y
As the move method is now done, we are back in the tick method
public void tick() { REMOVED code as it was not needed this.move(MovementType.SELF, this.getVelocity()); REMOVED code as it was not needed if (this.onGround) { this.setVelocity(this.getVelocity().multiply(0.7, -0.5, 0.7)); } REMOVED code as it was not needed }
We came out of the move method with a positive velocity. Now, as it hit a block going down, the onGround check was set to true. As the onGround check was set to true, the y velocity will be multiplied by -0.5, thus making it negative. When the tick is called again, the slime blocks will just keep smacking into the slime block, thus never bouncing up.
Below is an MCP print statement to show the same thing above.
[Player268: Summoned new Primed TNT] -9.04 before move in tick -9.04 pre move -9.04 Pre onLanded -9.04 enter bounce 7.231999999999999 return from bounce 7.231999999999999 Post onlanded 7.231999999999999 Pre ground and stepping 7.231999999999999 post ground and stepping 7.231999999999999 post move 7.231999999999999 after move in tick 7.087359999999999 before ground in tick -3.5436799999999997 after ground in tick
Solution
Like MC-207866,
If an entity has collided with a slime block in the "bounce", set the OnGround tag to false. This may have unforeseen consequences, but I can't think of any as of now.
Relates to MC-207866
dupe of MC-207866
Thank you for your report!
We're tracking this issue in MC-207866, so this ticket is being resolved and linked as a duplicate.
If you would like to add a vote and any extra information to the main ticket it would be appreciated.
If you haven't already, you might like to make use of the search feature to see if the issue has already been mentioned.
Quick Links:
📓 Bug Tracker Guidelines – 💬 Community Support – 📧 Mojang Support (Technical Issues) – 📧 Microsoft Support (Account Issues)
📓 Project Summary – ✍️ Feedback and Suggestions – 📖 Game Wiki
– I am a bot. This action was performed automatically! The ticket was resolved by one of our moderators, and I left this message to give more information to you.
Thank you, that helps a lot ![]()
After some further searching around, I was able to find MC-207866, which is triaged and seems to describe the same general behavior of entities (items in this case) getting stuck in the bubble column. Considering this issue hasn't really been maintained in recent years, it might make sense to merge this into the listed report/resolve it as a duplicate.
(Also, as a side note the image attached by Alexis is bedrock rather than Java, so the behavior is different)

Can confirm
can confirm in 1.18.1
Here's a clip of it affecting Grian. [1.19.4]
https://youtube.com/clip/UgkxPW1Ayt-80nNjLMUBZwOXQ4hb5QdyuE82
It's the same bug, except the tnt starts of by being on the soul sand with downwards momentum from the water pushing it down
I want to confirm this for 1.20.2. I'm trying to make a tnt launcher that pushes tnt up with bubble column, and had to do a very weird workaround to make sure the tnt isn't touching the soul sand when it enters the bubble column, else it gets stuck inside the soul sand and destroys the machine
it seems to me that, as most other entities, TNT should be pushed up if it enters the bubble column, even if it's sliding along the ground, and I probably shouldn't have to do this workaround
(had to add a gap under where the tnt enters so it doesn't ever touch the soulsand)