extends CharacterBody3D class_name Enemy const MOVEMENT_SPEED = 1 @onready var animationtree: AnimationTree = $enemies/AnimationPlayer/AnimationTree @onready var agent:NavigationAgent3D = $NavigationAgent @onready var enemyAi: EnemyAI = $BTPlayer @onready var health: Health = $Health @onready var origin: Node3D = $"enemies/Vert/Shoot Marker" @onready var enemyVisual: Node3D = $enemies/Vert @onready var shootSound: AudioStreamPlayer3D = $"enemies/Vert/Shoot Marker/ShootSound" @onready var deathSound: AudioStreamPlayer = $DeathSound const SPEED = 5.0 const JUMP_VELOCITY = 4.5 var movementBlend = 0; func _ready() -> void: health.death.connect(died) func died() -> void: deathSound.play() process_mode = Node.PROCESS_MODE_DISABLED await deathSound.finished queue_free() func updateMovementBlend(delta: float, to: float) -> void: movementBlend = move_toward(movementBlend, to, delta * 2); func rotateTo(delta: float, targetDirection: Vector3) -> void: self.global_basis.z = targetDirection; func _physics_process(delta: float) -> void: if agent.is_navigation_finished(): if enemyAi.aggressive: rotateTo(delta, (Player.Instance.global_position - self.global_position).normalized()) updateMovementBlend(delta, 0); self.animationtree['parameters/Movement/blend_position'] = movementBlend return var current_agent_position: Vector3 = global_position var next_path_position: Vector3 = agent.get_next_path_position() velocity = current_agent_position.direction_to(next_path_position) * MOVEMENT_SPEED move_and_slide() if enemyAi.aggressive: rotateTo(delta, (Player.Instance.global_position - self.global_position).normalized()) else: rotateTo(delta, velocity.normalized()) updateMovementBlend(delta, velocity.length()) self.animationtree['parameters/Movement/blend_position'] = movementBlend func fireWeapon() -> void: shootSound.play() var fireDirection = (Player.Instance.enemyTarget.global_position - origin.global_position).normalized() fireDirection = fireDirection.rotated(Vector3.UP, randf_range(-0.1, 0.1)) var query = PhysicsRayQueryParameters3D.create(origin.global_position, origin.global_position + fireDirection * 200) var result = get_world_3d().direct_space_state.intersect_ray(query) if not result: return var health = result.collider.get_node_or_null('Health') print(health) if not health: return result.collider.health.take_damage(1, Vector2(0,0), self.origin)