extends StaticBody3D @export var heal_amount: float = 30.0 # Сколько здоровья восстанавливает аптечка var detect_area: Area3D = null func _ready() -> void: # Ищем дочернюю зону, как в сцене твоего рабочего автомата detect_area = $DetectArea if detect_area == null: print("[АПТЕЧКА] ОШИБКА: Дочерний узел 'DetectArea' не найден!") func _physics_process(delta: float) -> void: if detect_area == null: return # Красивое вращение аптечки на полу (90 градусов в секунду) rotate_y(deg_to_rad(90.0) * delta) # Используем проверенный метод опроса зоны, как у автомата и NPC var overlapping_bodies = detect_area.get_overlapping_bodies() for body in overlapping_bodies: if body == self or body is StaticBody3D or "CSG" in body.name: continue # Проверяем, является ли вошедший объект игроком или его родителем var main_player = null if body.name == "PlayerCharacter": main_player = body elif body.get_parent() and body.get_parent().name == "PlayerCharacter": main_player = body.get_parent() # Если это точно PlayerCharacter if main_player != null: # Ищем HealthComponent строго у корня игрока var player_health = main_player.get_node_or_null("HealthComponent") if player_health == null: player_health = main_player.find_child("HealthComponent", true, false) if player_health: # Проверяем, нужно ли вообще лечить игрока (если хп меньше максимального) if player_health.current_health < player_health.max_health: # Добавляем здоровье player_health.current_health += heal_amount # Защита: здоровье не должно превышать максимум (например, стать 110 из 100) if player_health.current_health > player_health.max_health: player_health.current_health = player_health.max_health print("[АПТЕЧКА] Игрок исцелен! Текущее здоровье: ", player_health.current_health) # Удаляем аптечку со сцены, так как игрок её подобрал queue_free() return # Выходим, чтобы не проверять другие тела в этом кадре