diff --git a/Minecraft.World/LivingEntity.cpp b/Minecraft.World/LivingEntity.cpp index 3af9efe96..192823f1f 100644 --- a/Minecraft.World/LivingEntity.cpp +++ b/Minecraft.World/LivingEntity.cpp @@ -986,9 +986,30 @@ bool LivingEntity::onLadder() int yt = Mth::floor(bb->y0); int zt = Mth::floor(z); - // 4J-PB - TU9 - add climbable vines int iTile = level->getTile(xt, yt, zt); - return (iTile== Tile::ladder_Id) || (iTile== Tile::vine_Id); + switch (iTile) + { + case Tile::ladder_Id: + case Tile::vine_Id: // 4J-PB - TU9 - add climbable vines + return true; + case Tile::trapdoor_Id: // hexagonny - add climbable (opened) trapdoors + { + int data = level->getData(xt, yt, zt); + bool isOpen = (data & 0x4) != 0; + if (isOpen) + { + int belowTile = level->getTile(xt, yt - 1, zt); + if (belowTile == Tile::ladder_Id) + { + return true; + } + } + break; + } + default: + break; + } + return false; } bool LivingEntity::isShootable() diff --git a/Minecraft.World/TrapDoorTile.cpp b/Minecraft.World/TrapDoorTile.cpp index 6ea64172e..af00275fe 100644 --- a/Minecraft.World/TrapDoorTile.cpp +++ b/Minecraft.World/TrapDoorTile.cpp @@ -50,6 +50,18 @@ AABB *TrapDoorTile::getTileAABB(Level *level, int x, int y, int z) AABB *TrapDoorTile::getAABB(Level *level, int x, int y, int z) { + int data = level->getData(x, y, z); + bool isOpen = (data & 0x4) != 0; + + if (isOpen) + { + int belowTile = level->getTile(x, y - 1, z); + if (belowTile == Tile::ladder_Id) + { + return nullptr; // No collision when open above ladder + } + } + // Default behaviour updateShape(level, x, y, z); return Tile::getAABB(level, x, y, z); }