aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--Spigot-Server-Patches/0164-Fix-FallingBlocks-being-stuck-on-fences.patch89
1 files changed, 89 insertions, 0 deletions
diff --git a/Spigot-Server-Patches/0164-Fix-FallingBlocks-being-stuck-on-fences.patch b/Spigot-Server-Patches/0164-Fix-FallingBlocks-being-stuck-on-fences.patch
new file mode 100644
index 0000000000..8402132df1
--- /dev/null
+++ b/Spigot-Server-Patches/0164-Fix-FallingBlocks-being-stuck-on-fences.patch
@@ -0,0 +1,89 @@
+From a96203f8a887b86b0717f8c24bbb4d5ee3821c21 Mon Sep 17 00:00:00 2001
+From: Martin Panzer <[email protected]>
+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 e770063..1824587 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 a5d8f02..c0f0b07 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
+@@ -95,10 +97,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;
+@@ -155,6 +156,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();
+
+--
+1.9.1
+