public Room GetRoomForPosition(BlockPos pos) { long index3d = MapUtil.Index3dL(pos.X / chunksize, pos.Y / chunksize, pos.Z / chunksize, chunkMapSizeX, chunkMapSizeZ); ChunkRooms chunkrooms; Room room; lock (roomsByChunkIndexLock) { roomsByChunkIndex.TryGetValue(index3d, out chunkrooms); } if (chunkrooms != null) { Room firstEnclosedRoom = null; Room firstOpenedRoom = null; for (int i = 0; i < chunkrooms.Rooms.Count; i++) { room = chunkrooms.Rooms[i]; if (room.Location.Contains(pos)) { if (firstEnclosedRoom == null && room.ExitCount == 0) { firstEnclosedRoom = room; } if (firstOpenedRoom == null && room.ExitCount > 0) { firstOpenedRoom = room; } } } if (firstEnclosedRoom != null) { return(firstEnclosedRoom); } if (firstOpenedRoom != null) { return(firstOpenedRoom); } room = FindRoomForPosition(pos, chunkrooms); chunkrooms.AddRoom(room); return(room); } ChunkRooms rooms = new ChunkRooms(); room = FindRoomForPosition(pos, rooms); rooms.AddRoom(room); lock (roomsByChunkIndexLock) { roomsByChunkIndex[index3d] = rooms; } return(room); }