Использовать динамические зоны стримера. А стример, в свою очередь, делит всю карту на квадраты и проверяет только те динамические зоны, которые находятся в том же квадрате, в котором находится игрок, либо в ближайших (ну ещё сортирует координатыи т.п., но это уже не суть).
Так же можно заюзать
w_points, если по какой-то неизвестной причине ты решил не использовать стример.
Хотя тут проще завязать всё на стандартных пикапах. То бишь, игрок встал на пикап => произошёл вызов OnPlayerPickUpPickup => вызвали нужную ячейку массива, высчитав её из ID пикапа. Если пикапы домов создавать только при старте сервера, то для поиска нужной ячейки не потребуется никаких циклов. Достаточно при создании первого пикапа дома записать ID пикапа в какую-то переменную, а дальше значение этой переменной отнимать от ID пикапа. Если полученное значение не меньше 0 и не больше максимального индекса массива домов - вызван пикап дома.