// ClassicalSharp copyright 2014-2016 UnknownShadow200 | Licensed under MIT using System; using ClassicalSharp.Physics; using OpenTK; namespace ClassicalSharp { /// Shared helper class for respawning an entity. public static class Respawn { public static float HighestFreeY(Game game, ref AABB bb) { int minX = Utils.Floor(bb.Min.X), maxX = Utils.Floor(bb.Max.X); int minY = Utils.Floor(bb.Min.Y), maxY = Utils.Floor(bb.Max.Y); int minZ = Utils.Floor(bb.Min.Z), maxZ = Utils.Floor(bb.Max.Z); BlockInfo info = game.BlockInfo; float spawnY = float.NegativeInfinity; AABB blockBB = default(AABB); for (int y = minY; y <= maxY; y++) for (int z = minZ; z <= maxZ; z++) for (int x = minX; x <= maxX; x++) { byte block = game.World.GetPhysicsBlock(x, y, z); blockBB.Min = new Vector3(x, y, z) + info.MinBB[block]; blockBB.Max = new Vector3(x, y, z) + info.MaxBB[block]; if (info.Collide[block] != CollideType.Solid) continue; if (!bb.Intersects(blockBB)) continue; spawnY = Math.Max(spawnY, blockBB.Max.Y); } return spawnY; } } }