From fb10fff9b039b75ace511ad969874a5d46bed095 Mon Sep 17 00:00:00 2001 From: Martin Panzer Date: Sat, 4 Jun 2016 10:11:03 +0200 Subject: [PATCH] Fix fallingblocks getting stuck on fences --- ...-FallingBlocks-being-stuck-on-fences.patch | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 Spigot-Server-Patches/Fix-FallingBlocks-being-stuck-on-fences.patch diff --git a/Spigot-Server-Patches/Fix-FallingBlocks-being-stuck-on-fences.patch b/Spigot-Server-Patches/Fix-FallingBlocks-being-stuck-on-fences.patch new file mode 100644 index 0000000000..f38b02e18c --- /dev/null +++ b/Spigot-Server-Patches/Fix-FallingBlocks-being-stuck-on-fences.patch @@ -0,0 +1,87 @@ +From 0000000000000000000000000000000000000000 Mon Sep 17 00:00:00 2001 +From: Martin Panzer +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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/BlockFalling.java ++++ b/src/main/java/net/minecraft/server/BlockFalling.java +@@ -0,0 +0,0 @@ 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 0000000000000000000000000000000000000000..0000000000000000000000000000000000000000 100644 +--- a/src/main/java/net/minecraft/server/EntityFallingBlock.java ++++ b/src/main/java/net/minecraft/server/EntityFallingBlock.java +@@ -0,0 +0,0 @@ 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 +@@ -0,0 +0,0 @@ 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; +@@ -0,0 +0,0 @@ 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 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 list, Entity entity) { ++ blockData.a(world, where, collider, list, entity); ++ } ++ // Paper end ++ + public void e(float f, float f1) { + Block block = this.block.getBlock(); + +-- \ No newline at end of file