def METHOD_NAME(self, item: EXTENDED_ITEM_NAME, depth=0, force=True) -> bool:
    if item in EXTENDED_ITEM:
        self.logic.remove_item(EXTENDED_ITEM[item])
    placement_limit: EIN = self.logic.placement.item_placement_limit.get(
        item, EIN("")
    )
    accessible_locations = self.logic.accessible_checks(placement_limit)
    empty_locations = [
        loc
        for loc in accessible_locations
        if loc not in self.logic.placement.locations
    ]
    if empty_locations:
        location = self.rng.choice(empty_locations)
        result = self.logic.METHOD_NAME(location, item, fill=force)
        assert result  # Undefined if False
        return True
    # We have to replace an already placed item
    if not force or depth > 50:
        return False
    if not accessible_locations:
        raise self.useroutput.GenerationFailed(
            f"No more locations accessible for {item}."
        )
    self.check_known_failures(item)
    if had_banned := self.logic.inventory[BANNED_BIT]:
        self.logic.remove_item(BANNED_BIT)
    new_item = self.logic.replace_item(self.rng.choice(accessible_locations), item)
    if new_item not in self.progress_items and had_banned:
        self.logic.add_item(BANNED_BIT)
    ret = self.METHOD_NAME(new_item, depth + 1)
    if had_banned:
        self.logic.add_item(BANNED_BIT)
    return ret