code: async def find_placement(self, building: UnitTypeId, near: Union[Unit, Point2, Point3], max_distance: int=20, random_alternative: bool=True, placement_step: int=2) -> Optional[Point2]:
          
  
          assert isinstance(building, (AbilityId, UnitTypeId))
          assert isinstance(near, Point2)
  
          if isinstance(building, UnitTypeId):
              building = self._game_data.units[building.value].creation_ability
          else:  # AbilityId
              building = self._game_data.abilities[building.value]
  
          if await self.can_place(building, near):
              return near
  
          if max_distance == 0:
              return None
  
          for distance in range(placement_step, max_distance, placement_step):
              possible_positions = [Point2(p).offset(near).to2 for p in (
                      [(dx, -distance) for dx in range(-distance, distance + 1, placement_step)] +
                      [(dx, distance) for dx in range(-distance, distance + 1, placement_step)] +
                      [(-distance, dy) for dy in range(-distance, distance + 1, placement_step)] +
                      [(distance, dy) for dy in range(-distance, distance + 1, placement_step)]
              )]
              res = await self._client.query_building_placement(building, possible_positions)
              possible = [p for r, p in zip(res, possible_positions) if r == ActionResult.Success]
              if not possible:
                  continue
  
              if random_alternative:
                  return random.choice(possible)
              else:
                  return min(possible, key=lambda p: p.distance_to(near))
          return None
docs: Finds a placement location for building.