36 lines
1.2 KiB
GDScript
36 lines
1.2 KiB
GDScript
extends BehaviourAction
|
|
|
|
@export var anim_name : String = "jab_1"
|
|
@export var allow_interrupt : bool = true
|
|
@export var face_target : float = 0.0
|
|
@export var wait_for_finish : bool = true
|
|
@export var blend : float = 0.01
|
|
|
|
@onready var body : CharacterBody3D = get_behaviour_tree().get_parent() as CharacterBody3D
|
|
@onready var anim : AnimationPlayer = get_behaviour_tree().get_node("%AnimationPlayer") as AnimationPlayer
|
|
|
|
var target_position : Vector3 = Vector3.ZERO
|
|
var anim_started : bool = false
|
|
var target_valid : bool = false
|
|
|
|
func _enter() -> int:
|
|
anim_started = false
|
|
anim.play(anim_name, blend)
|
|
anim.advance(0)
|
|
target_valid = body.target != null
|
|
if target_valid:
|
|
target_position = body.target.global_position
|
|
return Running if wait_for_finish else Success
|
|
|
|
func _execute() -> int:
|
|
if wait_for_finish:
|
|
if face_target > 0.0 and target_valid:
|
|
var max_angle := body.global_basis.z.signed_angle_to(body.global_position - target_position, Vector3.UP)
|
|
body.rotate_y(clampf(max_angle, -face_target * get_process_delta_time(), face_target * get_process_delta_time()))
|
|
if anim.current_animation == anim_name:
|
|
anim_started = true
|
|
elif anim_started:
|
|
return Success
|
|
return Fail if allow_interrupt and body.hurt_high else Running
|
|
else:
|
|
return Success
|