57 lines
2.5 KiB
GDScript
57 lines
2.5 KiB
GDScript
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 # Выходим, чтобы не проверять другие тела в этом кадре
|