extends Node enum Role { TANK, DAMAGE, HEALER } # Basis (aus Resource geladen) var base: PlayerStats var speed := 5.0 var jump_velocity := 4.5 var target_range := 20.0 var combat_timeout := 3.0 var respawn_time := 3.0 var gcd_time := 0.5 var aa_cooldown := 0.5 # Laufzeit var health := 100.0 var max_health := 100.0 var health_regen := 0.0 var shield := 0.0 var max_shield := 0.0 var shield_regen_delay := 3.0 var shield_regen_time := 5.0 var shield_regen_timer := 0.0 var alive := true # Buffs var buff_damage := 1.0 var buff_heal := 1.0 var buff_shield := 1.0 # Rolle var current_role: int = Role.DAMAGE var ability_set: AbilitySet = null # Kampf var target: Node3D = null var in_combat := false var combat_timer := 0.0 # Cooldowns var cooldowns: Array[float] = [] var max_cooldowns: Array[float] = [] var gcd := 0.0 var aa_timer := 0.0 # Szenenwechsel var portal_position := Vector3.ZERO var returning_from_dungeon := false var dungeon_cleared := false # Cache für Szenenwechsel var _cache: Dictionary = {} func init_from_resource(res: PlayerStats) -> void: base = res speed = res.speed jump_velocity = res.jump_velocity target_range = res.target_range combat_timeout = res.combat_timeout respawn_time = res.respawn_time gcd_time = res.gcd_time aa_cooldown = res.aa_cooldown if _cache.is_empty(): health = res.max_health max_health = res.max_health health_regen = res.health_regen shield = res.max_shield max_shield = res.max_shield shield_regen_delay = res.shield_regen_delay shield_regen_time = res.shield_regen_time shield_regen_timer = 0.0 alive = true buff_damage = 1.0 buff_heal = 1.0 buff_shield = 1.0 else: _restore_cache() cooldowns.resize(5) cooldowns.fill(0.0) max_cooldowns.resize(5) max_cooldowns.fill(0.0) gcd = 0.0 aa_timer = 0.0 func set_health(value: float) -> void: health = value EventBus.health_changed.emit(self, health, max_health) if health <= 0 and alive: alive = false EventBus.entity_died.emit(self) func set_shield(value: float) -> void: shield = value EventBus.shield_changed.emit(self, shield, max_shield) func set_role(role: int) -> void: current_role = role EventBus.role_changed.emit(self, current_role) func set_target(new_target: Node3D) -> void: target = new_target EventBus.target_changed.emit(self, target) func respawn() -> void: health = max_health shield = max_shield alive = true EventBus.health_changed.emit(self, health, max_health) EventBus.shield_changed.emit(self, shield, max_shield) EventBus.player_respawned.emit(self) func save_cache() -> void: _cache = { "health": health, "max_health": max_health, "health_regen": health_regen, "shield": shield, "max_shield": max_shield, "shield_regen_delay": shield_regen_delay, "shield_regen_time": shield_regen_time, "alive": alive, "buff_damage": buff_damage, "buff_heal": buff_heal, "buff_shield": buff_shield, } func clear_cache() -> void: _cache.clear() portal_position = Vector3.ZERO returning_from_dungeon = false dungeon_cleared = false func _restore_cache() -> void: health = _cache.get("health", max_health) max_health = _cache.get("max_health", max_health) health_regen = _cache.get("health_regen", 0.0) shield = _cache.get("shield", 0.0) max_shield = _cache.get("max_shield", 0.0) shield_regen_delay = _cache.get("shield_regen_delay", 3.0) shield_regen_time = _cache.get("shield_regen_time", 5.0) alive = _cache.get("alive", true) buff_damage = _cache.get("buff_damage", 1.0) buff_heal = _cache.get("buff_heal", 1.0) buff_shield = _cache.get("buff_shield", 1.0) _cache.clear()