50 lines
1.6 KiB
GDScript
50 lines
1.6 KiB
GDScript
extends Unit
|
|
class_name Enemy
|
|
|
|
@export var player : Player
|
|
@export var chasing_range := 30.0
|
|
@export var attack_range := 2.0
|
|
|
|
var attacks := ["Unarmed_Melee_Attack_Punch_A","Unarmed_Melee_Attack_Punch_A 2","Unarmed_Melee_Attack_Punch_B"]
|
|
|
|
@onready var nav_agent: NavigationAgent3D = $NavigationAgent3D
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if player == null: return
|
|
if player.dead: return
|
|
var distance = global_position.distance_to(player.global_position)
|
|
#print(distance)
|
|
if distance <= attack_range:
|
|
attack()
|
|
elif distance <= chasing_range:
|
|
chase_player(player.position)
|
|
|
|
func attack() -> void:
|
|
if enough_stamina_available(attack_cost):
|
|
use_stamina(attack_cost)
|
|
anim_state.travel(attacks.pick_random())
|
|
|
|
func chase_player(player_position: Vector3) -> void:
|
|
nav_agent.set_target_position(player_position)
|
|
if nav_agent.is_navigation_finished() or nav_agent.is_target_reached(): return
|
|
var next_path_position: Vector3 = nav_agent.get_next_path_position()
|
|
model.look_at(next_path_position)
|
|
var new_velocity: Vector3 = global_position.direction_to(next_path_position) * speed
|
|
_on_velocity_computed(new_velocity)
|
|
|
|
func _on_velocity_computed(safe_velocity: Vector3) -> void:
|
|
velocity = safe_velocity
|
|
var vy = velocity.y
|
|
velocity.y = 0
|
|
var vl = velocity * model.transform.basis
|
|
anim_tree.set("parameters/IWR/blend_position", Vector2(vl.x, -vl.z) / speed)
|
|
velocity.y = vy
|
|
move_and_slide()
|
|
|
|
func _on_animation_tree_animation_started(anim_name: StringName) -> void:
|
|
pass
|
|
|
|
func _on_animation_tree_animation_finished(anim_name: StringName) -> void:
|
|
if attacks.has(anim_name):
|
|
player.take_damage(damage)
|