78 lines
2.4 KiB
GDScript
78 lines
2.4 KiB
GDScript
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)
|