Files
mmo/scripts/components/spawner.gd
Marek Le 4fddc74df1 update
2026-03-30 09:03:29 +02:00

45 lines
1.4 KiB
GDScript

extends Node
@export var spawn_scene: PackedScene
@export var spawn_count := 3
@export var thresholds: Array[float] = [0.85, 0.70, 0.55, 0.40, 0.25, 0.10]
var triggered: Array[bool] = []
@onready var parent: Node3D = get_parent()
@onready var health: Node = get_parent().get_node("Health")
func _ready() -> void:
triggered.resize(thresholds.size())
triggered.fill(false)
func _process(_delta: float) -> void:
if not spawn_scene or health.current_health <= 0:
return
var ratio: float = health.current_health / health.max_health
for i in range(thresholds.size()):
if not triggered[i] and ratio <= thresholds[i]:
triggered[i] = true
_spawn()
func _spawn() -> void:
var spawned: Array = []
for j in range(spawn_count):
var entity: Node = spawn_scene.instantiate()
var offset := Vector3(randf_range(-2, 2), 0, randf_range(-2, 2))
parent.get_parent().add_child(entity)
entity.global_position = parent.global_position + offset
if "spawn_position" in entity:
entity.spawn_position = parent.global_position
if "portal" in entity:
entity.portal = parent
spawned.append(entity)
var player: Node = get_tree().get_first_node_in_group("player")
if player:
var dist: float = parent.global_position.distance_to(player.global_position)
if dist <= 10.0:
for entity in spawned:
if entity.has_method("_engage"):
entity._engage(player)
EventBus.portal_spawn.emit(parent, spawned)