c03e56be67
Our improved hopper checking system should provide a better benefit without as many vanilla behavior issues.
89 lines
3.5 KiB
Diff
89 lines
3.5 KiB
Diff
From d11bdc71163cd991a87f8268bbf0a7f9ac06a9ff Mon Sep 17 00:00:00 2001
|
|
From: Martin Panzer <postremus1996@googlemail.com>
|
|
Date: Fri, 3 Jun 2016 23:13:39 +0200
|
|
Subject: [PATCH] Fix FallingBlocks being stuck on fences
|
|
|
|
Fallingblocks would previously only check if directly beneath them a block exists. They also
|
|
hover on top of the 1.5 block tall hitbox of fences during these check. This
|
|
resulted in them always thinking they would be on air.
|
|
|
|
We now first check, if if we are already on the ground.
|
|
if not, we check if the falling block is inside of the hitbox of the block at y - 1.
|
|
|
|
diff --git a/src/main/java/net/minecraft/server/BlockFalling.java b/src/main/java/net/minecraft/server/BlockFalling.java
|
|
index 8f22dab..d3a0d70 100644
|
|
--- a/src/main/java/net/minecraft/server/BlockFalling.java
|
|
+++ b/src/main/java/net/minecraft/server/BlockFalling.java
|
|
@@ -71,5 +71,11 @@ public class BlockFalling extends Block {
|
|
return block == Blocks.FIRE || material == Material.AIR || material == Material.WATER || material == Material.LAVA;
|
|
}
|
|
|
|
+ // Paper start - OBFHELPER
|
|
+ public static boolean canMoveThrough(IBlockData blockdata) {
|
|
+ return BlockFalling.i(blockdata);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public void a_(World world, BlockPosition blockposition) {}
|
|
}
|
|
diff --git a/src/main/java/net/minecraft/server/EntityFallingBlock.java b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
index 4fd4371..c4d90b0 100644
|
|
--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
+++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java
|
|
@@ -2,7 +2,9 @@ package net.minecraft.server;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import java.util.ArrayList;
|
|
+import java.util.Arrays;
|
|
import java.util.Iterator;
|
|
+import java.util.List;
|
|
import javax.annotation.Nullable;
|
|
|
|
import org.bukkit.craftbukkit.event.CraftEventFactory; // CraftBukkit
|
|
@@ -98,10 +100,9 @@ public class EntityFallingBlock extends Entity {
|
|
blockposition = new BlockPosition(this);
|
|
if (this.onGround) {
|
|
IBlockData iblockdata = this.world.getType(blockposition);
|
|
-
|
|
- if (BlockFalling.i(this.world.getType(new BlockPosition(this.locX, this.locY - 0.009999999776482582D, this.locZ)))) {
|
|
+ if (!isOnGround()) {
|
|
this.onGround = false;
|
|
- // return; // CraftBukkit
|
|
+ return; // Paper
|
|
}
|
|
|
|
this.motX *= 0.699999988079071D;
|
|
@@ -158,6 +159,30 @@ public class EntityFallingBlock extends Entity {
|
|
}
|
|
}
|
|
|
|
+ // Paper start
|
|
+ private boolean isOnGround() {
|
|
+ BlockPosition where = new BlockPosition(this.locX, this.locY - 0.009999999776482582D, this.locZ);
|
|
+
|
|
+ if (!BlockFalling.canMoveThrough(this.world.getType(where))) {
|
|
+ return true;
|
|
+ }
|
|
+
|
|
+ IBlockData blockData = this.world.getType(where.down());
|
|
+ if (BlockFalling.canMoveThrough(blockData)) {
|
|
+ return false;
|
|
+ }
|
|
+
|
|
+ List<AxisAlignedBB> list = new ArrayList<>();
|
|
+ addCollisions(blockData, getWorld(), where, this.getBoundingBox(), list, this);
|
|
+ return list.size() > 0;
|
|
+ }
|
|
+
|
|
+ // OBFHELPER
|
|
+ private void addCollisions(IBlockData blockData, World world, BlockPosition where, AxisAlignedBB collider, List<AxisAlignedBB> list, Entity entity) {
|
|
+ blockData.a(world, where, collider, list, entity);
|
|
+ }
|
|
+ // Paper end
|
|
+
|
|
public void e(float f, float f1) {
|
|
Block block = this.block.getBlock();
|
|
|
|
--
|
|
2.9.0
|
|
|