From c1041b0c40c0bbb7416bbb41260a616f90527aef Mon Sep 17 00:00:00 2001 From: UnknownShadow200 Date: Thu, 22 Oct 2015 09:41:55 +1100 Subject: [PATCH] Fix small physics collision detection issues from tiny floating point roundoff errors. --- ClassicalSharp/Entities/PhysicsEntity.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/ClassicalSharp/Entities/PhysicsEntity.cs b/ClassicalSharp/Entities/PhysicsEntity.cs index d925c3943..6f5f024df 100644 --- a/ClassicalSharp/Entities/PhysicsEntity.cs +++ b/ClassicalSharp/Entities/PhysicsEntity.cs @@ -121,29 +121,29 @@ namespace ClassicalSharp { Utils.LogWarning( "t > 1 in physics calculation.. this shouldn't have happened." ); BoundingBox finalBB = entityBB.Offset( Velocity * new Vector3( tx, ty, tz ) ); - if( finalBB.Min.Y >= blockBB.Max.Y ) { + if( finalBB.Min.Y + Adjustment >= blockBB.Max.Y ) { Position.Y = blockBB.Max.Y + Adjustment; onGround = true; - ClipY( ref size, ref entityBB, ref entityExtentBB ); - } else if( finalBB.Max.Y <= blockBB.Min.Y ) { + ClipY( ref size, ref entityBB, ref entityExtentBB ); + } else if( finalBB.Max.Y - Adjustment <= blockBB.Min.Y ) { Position.Y = blockBB.Min.Y - size.Y - Adjustment; - ClipY( ref size, ref entityBB, ref entityExtentBB ); - } else if( finalBB.Min.X >= blockBB.Max.X ) { + ClipY( ref size, ref entityBB, ref entityExtentBB ); + } else if( finalBB.Min.X + Adjustment >= blockBB.Max.X ) { if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { Position.X = blockBB.Max.X + size.X / 2 + Adjustment; ClipX( ref size, ref entityBB, ref entityExtentBB ); } - } else if( finalBB.Max.X <= blockBB.Min.X ) { + } else if( finalBB.Max.X - Adjustment <= blockBB.Min.X ) { if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { Position.X = blockBB.Min.X - size.X / 2 - Adjustment; ClipX( ref size, ref entityBB, ref entityExtentBB ); } - } else if( finalBB.Min.Z >= blockBB.Max.Z ) { + } else if( finalBB.Min.Z + Adjustment >= blockBB.Max.Z ) { if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { Position.Z = blockBB.Max.Z + size.Z / 2 + Adjustment; ClipZ( ref size, ref entityBB, ref entityExtentBB ); } - } else if( finalBB.Max.Z <= blockBB.Min.Z ) { + } else if( finalBB.Max.Z - Adjustment <= blockBB.Min.Z ) { if( !wasOn || !DidSlide( ref blockBB, ref size, ref finalBB, ref entityBB, ref entityExtentBB ) ) { Position.Z = blockBB.Min.Z - size.Z / 2 - Adjustment; ClipZ( ref size, ref entityBB, ref entityExtentBB );