pathfinding rework for now

This commit is contained in:
2025-06-13 00:06:51 +10:00
parent 400415f8a5
commit 6f4f465e37
817 changed files with 5533 additions and 3146 deletions

View File

@ -10,6 +10,7 @@ class_name LeapingController extends PathingController
@export var souths: Sprite3D
@export var box: CSGBox3D
@export var tol: Label
@export var jump_distance: float = 4.0
var tolerance: float = 50.0
var jumping: bool = false
@ -21,20 +22,19 @@ func _process(delta: float) -> void:
func _physics_process(delta: float) -> void:
if !path or jumping:
if !next_node or jumping:
return
var distance_travelled: float = (character.stats.movement_speed * clampf(character.movement_speed_penalty, 0.0, 1.0)) * delta
distance_remaining -= distance_travelled
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: int = astar.astar.get_closest_point(character.global_position, false)
box.global_position = astar.astar.get_point_position(closest_point)
var east: int = astar.get_east_point(closest_point)
var west: int = astar.get_west_point(closest_point)
var north: int = astar.get_north_point(closest_point)
var south: int = astar.get_south_point(closest_point)
walk(delta)
consider_leap(Vector3.FORWARD)
consider_leap(Vector3.LEFT)
consider_leap(Vector3.BACK)
consider_leap(Vector3.RIGHT)
#var closest_point: int = astar.astar.get_closest_point(character.global_position, false)
#box.global_position = astar.astar.get_point_position(closest_point)
#var east: int = astar.get_east_point(closest_point)
#var west: int = astar.get_west_point(closest_point)
#var north: int = astar.get_north_point(closest_point)
#var south: int = astar.get_south_point(closest_point)
#if east >= 0 and astar.astar.is_point_disabled(east):
#eastl.text = "fuck no"
#else:
@ -51,95 +51,117 @@ func _physics_process(delta: float) -> void:
#southl.text = "fuck no"
#else:
#southl.text = "yeah"
norths.global_position = character.global_position + Vector3(-1.0, 1.0, 0.0)
souths.global_position = character.global_position + Vector3(1.0, 1.0, 0.0)
easts.global_position = character.global_position + Vector3(0.0, 1.0, -1.0)
wests.global_position = character.global_position + Vector3(0.0, 1.0, 1.0)
if east >= 0:
if astar.astar.is_point_disabled(east):
var further_point: int = astar.get_east_point(east)
if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(0.0, 0.0, -4.0))
var current_offset: float = path.get_closest_offset(character.global_position)
var gain: float = expected_offset - current_offset
if gain >= tolerance:
distance_remaining -= gain
path_progress += gain
leap(Vector3(0.0, 0.0, -4.0))
eastl.text = str(gain)
#easts.visible = true
else:
eastl.text = "cant"
else:
eastl.text = "clear"
else:
eastl.text = "invalid"
if west >= 0:
if astar.astar.is_point_disabled(west):
var further_point: int = astar.get_west_point(west)
if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(0.0, 0.0, 4.0))
var current_offset: float = path.get_closest_offset(character.global_position)
var gain: float = expected_offset - current_offset
if gain >= tolerance:
distance_remaining -= gain
path_progress += gain
leap(Vector3(0.0, 0.0, 4.0))
westl.text = str(gain)
#wests.visible = true
else:
westl.text = "cant"
else:
westl.text = "clear"
else:
westl.text = "invalid"
if north >= 0:
if astar.astar.is_point_disabled(north):
var further_point: int = astar.get_north_point(north)
if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(-4.0, 0.0, 0.0))
var current_offset: float = path.get_closest_offset(character.global_position)
var gain: float = expected_offset - current_offset
if gain >= tolerance:
distance_remaining -= gain
path_progress += gain
leap(Vector3(-4.0, 0.0, 0.0))
northl.text = str(gain)
#norths.visible = true
else:
northl.text = "cant"
else:
northl.text = "clear"
else:
northl.text = "invalid"
if south >= 0:
if astar.astar.is_point_disabled(south):
var further_point: int = astar.get_south_point(south)
if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(4.0, 0.0, 0.0))
var current_offset: float = path.get_closest_offset(character.global_position)
var gain: float = expected_offset - current_offset
if gain >= tolerance:
distance_remaining -= gain
path_progress += gain
leap(Vector3(4.0, 0.0, 0.0))
southl.text = str(gain)
#souths.visible = true
else:
southl.text = "cant"
else:
southl.text = "clear"
else:
southl.text = "invalid"
#norths.global_position = character.global_position + Vector3(-1.0, 1.0, 0.0)
#souths.global_position = character.global_position + Vector3(1.0, 1.0, 0.0)
#easts.global_position = character.global_position + Vector3(0.0, 1.0, -1.0)
#wests.global_position = character.global_position + Vector3(0.0, 1.0, 1.0)
#if east >= 0:
#if astar.astar.is_point_disabled(east):
#var further_point: int = astar.get_east_point(east)
#if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
#var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(0.0, 0.0, -4.0))
#var current_offset: float = path.get_closest_offset(character.global_position)
#var gain: float = expected_offset - current_offset
#if gain >= tolerance:
#distance_remaining -= gain
##path_progress += gain
#leap(Vector3(0.0, 0.0, -4.0))
#eastl.text = str(gain)
##easts.visible = true
#else:
#eastl.text = "cant"
#else:
#eastl.text = "clear"
#else:
#eastl.text = "invalid"
#if west >= 0:
#if astar.astar.is_point_disabled(west):
#var further_point: int = astar.get_west_point(west)
#if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
#var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(0.0, 0.0, 4.0))
#var current_offset: float = path.get_closest_offset(character.global_position)
#var gain: float = expected_offset - current_offset
#if gain >= tolerance:
#distance_remaining -= gain
##path_progress += gain
#leap(Vector3(0.0, 0.0, 4.0))
#westl.text = str(gain)
##wests.visible = true
#else:
#westl.text = "cant"
#else:
#westl.text = "clear"
#else:
#westl.text = "invalid"
#if north >= 0:
#if astar.astar.is_point_disabled(north):
#var further_point: int = astar.get_north_point(north)
#if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
#var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(-4.0, 0.0, 0.0))
#var current_offset: float = path.get_closest_offset(character.global_position)
#var gain: float = expected_offset - current_offset
#if gain >= tolerance:
#distance_remaining -= gain
##path_progress += gain
#leap(Vector3(-4.0, 0.0, 0.0))
#northl.text = str(gain)
##norths.visible = true
#else:
#northl.text = "cant"
#else:
#northl.text = "clear"
#else:
#northl.text = "invalid"
#if south >= 0:
#if astar.astar.is_point_disabled(south):
#var further_point: int = astar.get_south_point(south)
#if further_point >= 0 and !astar.astar.is_point_disabled(further_point):
#var expected_offset: float = path.get_closest_offset(character.global_position + Vector3(4.0, 0.0, 0.0))
#var current_offset: float = path.get_closest_offset(character.global_position)
#var gain: float = expected_offset - current_offset
#if gain >= tolerance:
#distance_remaining -= gain
##path_progress += gain
#leap(Vector3(4.0, 0.0, 0.0))
#southl.text = str(gain)
##souths.visible = true
#else:
#southl.text = "cant"
#else:
#southl.text = "clear"
#else:
#southl.text = "invalid"
func consider_leap(direction: Vector3) -> void:
var node: FlowNode = check_jump(character.global_position + (direction * jump_distance))
if node:
var expected_distance_remaining: float = calculate_distance_to_goal(node)
expected_distance_remaining += (character.global_position + (direction * jump_distance)).distance_to(node.global_position)
var gain: float = distance_remaining - expected_distance_remaining
if gain >= tolerance:
distance_remaining -= gain
leap(direction * jump_distance)
next_node = node
func finish_jump() -> void:
jumping = false
func check_jump(destination: Vector3) -> FlowNode:
var closest_point: FlowNode = flow_field.get_closest_traversable_point(destination)
if !closest_point.best_path or closest_point.global_position.distance_to(destination) > 1.2:
return null
return closest_point.best_path
func leap(to_point: Vector3) -> void:
jumping = true
var tween: Tween = create_tween()
tween.tween_property(character, "global_position", character.global_position + (to_point / 2.0) + Vector3.UP, 0.5)
tween.tween_property(character, "global_position", character.global_position + to_point, 0.5)
tween.tween_property(character, "global_position", character.global_position + (to_point / 2.0) + Vector3.UP, 0.3)
tween.tween_property(character, "global_position", character.global_position + to_point, 0.3)
tween.tween_callback(finish_jump)