60 lines
1.6 KiB
GDScript
60 lines
1.6 KiB
GDScript
extends KinematicBody
|
|
|
|
export(NodePath) var player_path
|
|
export(float) var speed
|
|
|
|
onready var growl_sound = get_node("GrowlSound")
|
|
onready var confuse_sound = get_node("ConfuseSound")
|
|
onready var see_sound = get_node("SeeSound")
|
|
|
|
var _current_nav_path: PoolVector3Array
|
|
var _player
|
|
var _had_path_in_previous_frame = false
|
|
|
|
onready var _navigation = get_parent()
|
|
|
|
|
|
func _ready():
|
|
_player = get_node(player_path)
|
|
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
# Play growling sound at random interval
|
|
var distance_to_player = (_player.transform.origin - transform.origin).length()
|
|
|
|
if randi() % 1000 == 1 and not _is_any_sound_playing():
|
|
growl_sound.play()
|
|
|
|
|
|
func _process(delta):
|
|
var to = _navigation.get_closest_point(_player.transform.origin)
|
|
_current_nav_path = _navigation.get_simple_path(transform.origin, to)
|
|
|
|
var dir: Vector3
|
|
|
|
if _current_nav_path.size() > 0:
|
|
if not _had_path_in_previous_frame and not _is_any_sound_playing():
|
|
see_sound.play()
|
|
|
|
var index = 0
|
|
if (_current_nav_path[0] - transform.origin).length() < 0.1: index = 1
|
|
|
|
dir = (_current_nav_path[index] - transform.origin).normalized()
|
|
|
|
_had_path_in_previous_frame = true
|
|
else:
|
|
if _had_path_in_previous_frame and not _is_any_sound_playing():
|
|
confuse_sound.play()
|
|
|
|
dir = (_player.transform.origin - transform.origin).normalized()
|
|
_had_path_in_previous_frame = false
|
|
|
|
if (dir.x != 0.0 and dir.z != 0.0):
|
|
look_at(transform.origin + Vector3(dir.x, 0.0, dir.z), Vector3.UP)
|
|
|
|
move_and_slide(dir * speed)
|
|
|
|
|
|
func _is_any_sound_playing():
|
|
return growl_sound.playing or confuse_sound.playing or see_sound.playing
|