diff --git a/ClassicalSharp/ClassicalSharp.csproj b/ClassicalSharp/ClassicalSharp.csproj index 11c40cb3b..9206d6d9d 100644 --- a/ClassicalSharp/ClassicalSharp.csproj +++ b/ClassicalSharp/ClassicalSharp.csproj @@ -4,7 +4,7 @@ {BEB1C785-5CAD-48FF-A886-876BF0A318D4} Debug AnyCPU - WinExe + Exe ClassicalSharp ClassicalSharp v2.0 diff --git a/ClassicalSharp/Entities/LocalPlayer.cs b/ClassicalSharp/Entities/LocalPlayer.cs index a12371c7c..6b8d8cf1f 100644 --- a/ClassicalSharp/Entities/LocalPlayer.cs +++ b/ClassicalSharp/Entities/LocalPlayer.cs @@ -238,20 +238,9 @@ namespace ClassicalSharp.Entities { internal bool HandleKeyDown( Key key ) { KeyMap keys = game.InputHandler.Keys; if( key == keys[KeyBinding.Respawn] && Hacks.CanRespawn ) { - Vector3I p = Vector3I.Floor( SpawnPoint ); - if( game.World.IsValidPos( p ) ) { - // Spawn player at highest valid position. - for( int y = p.Y; y <= game.World.Height; y++ ) { - byte block1 = physics.GetPhysicsBlockId( p.X, y, p.Z ); - byte block2 = physics.GetPhysicsBlockId( p.X, y + 1, p.Z ); - if( info.Collide[block1] != CollideType.Solid && - info.Collide[block2] != CollideType.Solid ) { - p.Y = y; - break; - } - } - } - Vector3 spawn = (Vector3)p + new Vector3( 0.5f, 0.01f, 0.5f ); + Vector3 spawn = SpawnPoint; + if( game.World.IsValidPos( Vector3I.Floor( spawn ) ) ) + FindHighestFree( ref spawn ); LocationUpdate update = LocationUpdate.MakePosAndOri( spawn, SpawnYaw, SpawnPitch, false ); SetLocation( update, false ); } else if( key == keys[KeyBinding.SetSpawn] && Hacks.CanRespawn ) { @@ -276,5 +265,38 @@ namespace ClassicalSharp.Entities { } return true; } + + void FindHighestFree( ref Vector3 spawn ) { + Vector3 size = Model.CollisionSize; + BoundingBox bb = CollisionBounds; + Vector3I P = Vector3I.Floor( spawn ); + int bbMax = Utils.Floor( size.Y ); + + int minX = Utils.Floor( -size.X / 2 ), maxX = Utils.Floor( size.X / 2 ); + int minZ = Utils.Floor( -size.Z / 2 ), maxZ = Utils.Floor( size.Z / 2 ); + + // Spawn player at highest valid position. + for( int y = P.Y; y <= game.World.Height; y++ ) { + bool anyHit = false; + Console.WriteLine( "~~~~~" ); + for( int yy = 0; yy <= bbMax; yy++ ) + for( int zz = minZ; zz <= maxZ; zz++ ) + for ( int xx = minX; xx <= maxX; xx++ ) + { + Vector3I coords = new Vector3I( P.X + xx, y + yy, P.Z + zz ); + byte block = physics.GetPhysicsBlockId( coords.X, coords.Y, coords.Z ); + Vector3 min = info.MinBB[block] + (Vector3)coords; + Vector3 max = info.MaxBB[block] + (Vector3)coords; + Console.WriteLine( min + "_" + max ); + if( !bb.Intersects( new BoundingBox( min, max ) ) ) continue; + anyHit |= info.Collide[block] == CollideType.Solid; + } + + if( !anyHit ) { + spawn.Y = y + Entity.Adjustment; + return; + } + } + } } } \ No newline at end of file