Files
mtd/Scripts/EnemyAI/pathing_controller.gd
2025-06-13 00:06:51 +10:00

48 lines
1.7 KiB
GDScript

class_name PathingController extends EnemyMovement
#var path: Curve3D
#var path_progress: float = 0.0
var flow_field: FlowField
var next_node: FlowNode
func _ready() -> void:
#if path:
# distance_remaining = path.get_baked_length()
next_node = flow_field.get_closest_traversable_point(character.global_position)
distance_remaining += calculate_distance_to_goal(next_node)
func calculate_distance_to_goal(node: FlowNode) -> float:
var distance: float = 0.0
distance += character.global_position.distance_to(node.global_position)
if node.best_path:
var then_next_node: FlowNode = node.best_path
distance += node.global_position.distance_to(then_next_node.global_position)
while then_next_node.best_path:
distance += then_next_node.global_position.distance_to(then_next_node.best_path.global_position)
then_next_node = then_next_node.best_path
return distance
func walk(delta: float) -> void:
var distance_travelled: float = (character.stats.movement_speed * clampf(character.movement_speed_penalty, 0.0, 1.0)) * delta
distance_remaining -= distance_travelled
character.global_position = character.global_position.move_toward(next_node.global_position, distance_travelled)
character.look_at(next_node.global_position)
if character.global_position.distance_to(next_node.global_position) <= 0.05:
next_node = next_node.best_path
func _physics_process(delta: float) -> void:
#if !path:
# return
if !next_node:
return
walk(delta)
#path_progress += distance_travelled
#var sample: Transform3D = path.sample_baked_with_rotation(path_progress, true)
#character.global_position = sample.origin
#character.look_at(character.global_position + -sample.basis.z)
#var closest_point: Vector3 = path.get_closest_point(character.global_position)